簡體   English   中英

圍繞類C ++的包裝

[英]Wrapper around a class C++

假設C ++類具有以下形式的構造函數(除其他構造函數外)

Foo::Foo( FILE *fp ) { etc... }

現在我要創建表單的包裝器類

class WFoo {
      Foo::Foo A;
      Foo::Foo B;
 };

與構造函數

WFoo::WFoo(FILE *fa, FILE *fb) {
      A(fa), B(fb);
}

WFoo的定義有什么問題? 提前致謝。

這沒有任何意義...

class WFoo {
      Foo::Foo A;
      Foo::Foo B;
 };

你的意思是...

class WFoo {
public:
      Foo A;
      Foo B;

      WFoo(FILE* fa, FILE* fb);
 };

WFoo::WFoo(FILE* fa, FILE* fb) :
    A(fa), B(fb)
{
}

還請記住,字段的初始化不是按照您在構造函數中讀取的順序進行,而是按照在類中聲明的順序進行初始化!

所以...

#include <iostream>

struct XFoo
{
    XFoo(const char* s) { std::cout << s << std::endl; }
};

struct YBar
{
    XFoo a;
    XFoo b;

    YBar() : a("A"), b("B") {}
};

struct ZBar
{
    XFoo b;
    XFoo a;

    ZBar() : a("A"), b("B") {}
};


int main()
{
    YBar y;
    ZBar z;
    return 0;
}

將打印出來...

A
B
B
A

這是一個初始化列表,但語法已關閉。 嘗試:

WFoo::WFoo(FILE* fa, FILE* fb) : A(fa), B(fb)
  {
  }    

您要查找的語法是:

WFoo::WFoo(FILE *fa, FILE *fb) : A(fa), B(fb) { ... }

並且,除非Foo位於名為Foo的命名空間中,否則WFoo不會:

class WFoo {
   Foo A;
   Foo B;
};

如果你發布的代碼是psudocode,那么就沒有什么不妥的定義WFoo

另一方面,如果您發布的代碼不是psudocode,而是您嘗試編譯和運行的實際代碼,則這是WFoo

  1. 您要Foo A; 不是Foo::Foo A除非Foo在名為Foo的命名空間中(這很糟糕)
  2. 沒有轉換構造函數聲明。
  3. 您沒有使用正確的初始化列表語法。

這就是你想要的:

WFoo::WFoo(FILE* fa, FILE* fb)
:  A(fa), B(fb)
{
}

請注意,初始值設定項列表位於構造函數的主體之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM