Обертка вокруг класса 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? Заранее спасибо.


person Ilonpilaaja    schedule 26.10.2011    source источник


Ответы (4)


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

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)
{
}

Помните также, что поля инициализируются не в том порядке, в котором вы читаете в конструкторе, а в том порядке, в котором они объявлены в классе!

So...

#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
person Salvatore Previti    schedule 26.10.2011

Это список инициализаторов, но синтаксис отключен. Пытаться:

WFoo::WFoo(FILE* fa, FILE* fb) : A(fa), B(fb)
  {
  }    
person rchilton1980    schedule 26.10.2011

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

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

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

class WFoo {
   Foo A;
   Foo B;
};
person Mat    schedule 26.10.2011

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

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

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

Это то, что вы хотите:

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

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

person John Dibling    schedule 26.10.2011