Обертка вокруг класса C ++ - PullRequest
1 голос
/ 26 октября 2011

предположим, что класс 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?Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 26 октября 2011

Это не имеет никакого смысла ...

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
2 голосов
/ 26 октября 2011

Это список инициализаторов, но синтаксис отключен. Попробуйте:

WFoo::WFoo(FILE* fa, FILE* fb) : A(fa), B(fb)
  {
  }    
1 голос
/ 26 октября 2011

Если код, который вы разместили, является псевдокодом, то ничего неверно с определением WFoo.

Если, с другой стороны, код, который выОпубликовано не предназначено для псевдокода, но фактический код, который вы попытаетесь скомпилировать и запустить, вот что не так с WFoo:

  1. Вы хотите Foo A; Не Foo::Foo A если1012 * находится в пространстве имен с именем Foo (что было бы неправильно)
  2. Нет объявления конструктора преобразования.
  3. Вы не используете правильный синтаксис для списка инициализатора.

Это то, что вам нужно:

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

Обратите внимание, что список инициализаторов находится перед телом конструктора.

1 голос
/ 26 октября 2011

Синтаксис, который вы ищете:

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

И, если Foo не находится в пространстве имен с именем Foo и WFoo не является:

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