Почему я не могу определить вложенный класс извне? - PullRequest
0 голосов
/ 25 сентября 2011

У меня проблемы с созданием объектной модели, включающей вложенные классы, с использованием MinGW C ++. Вот пример, который разоблачает мою проблему:

foo.h:

/*
 * foo.h
 *
 *  Created on: Sep 25, 2011
 *      Author: AutoBot
 */

#ifndef FOO_H_
#define FOO_H_

class Foo
{
public:
    class Bar;
    Bar bar;
} extern foo;


#endif /* FOO_H_ */

bar.h:

/*
 * bar.h
 *
 *  Created on: Sep 25, 2011
 *      Author: AutoBot
 */

#ifndef BAR_H_
#define BAR_H_

#include <iostream>
using namespace std;

#include "foo.h"

class Foo::Bar
{
public:
    void Test() {cout <<"Test!";}
};


#endif /* BAR_H_ */

main.cpp:

/*
 * main.cpp
 *
 *  Created on: Sep 25, 2011
 *      Author: AutoBot
 */



#include "foo.h"

Foo foo;

int main (int argc, char *argv[])
{
    foo.bar.Test();
    return 0;
}

Журнал сборки Eclipse CDT:

**** Build of configuration Debug for project NestedClassTest ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o src\main.o ..\src\main.cpp
In file included from ..\src\main.cpp:10:0:
..\src\/foo.h:15:6: error: field 'bar' has incomplete type
..\src\main.cpp: In function 'int main(int, char**)':
..\src\main.cpp:16:6: error: 'class Foo' has no member named 'bar'
Build error occurred, build is stopped
Time consumed: 171  ms.

Так что, по сути, он не может распознать определение бара, которое я сделал в bar.h. Это нормально? Почему я не могу определить вложенные классы таким образом? Это просто ограничение набора инструментов MinGW? Любая помощь / совет приветствуется.

Примечание: в моей настоящей программе я намерен, чтобы "foo" из нее теоретически служил одноэлементным классом. Он будет представлять приложение в целом, и его подсистемы (или «бары») будут определены и созданы один раз внутри класса. Я делаю это, чтобы попытаться сделать код более управляемым. Если кто-то имеет в виду более выполнимый шаблон дизайна, пожалуйста, скажите мне!

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Проблема здесь:

class Foo
{
public:
    class Bar;
    Bar bar;
};

На данный момент Foo::Bar является неполным типом.И вы не можете объявить переменную неполного типа.Это ничем не отличается от попытки сделать это:

class Foo;
Foo foo;

Они оба запрещены и по одной и той же причине.

Вы можете превратить bar в какой-то (умныйуказательНо это единственный способ решить эту проблему.

2 голосов
/ 25 сентября 2011

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

class Foo
{
public:
    class Bar;
    Bar bar;
} extern foo;

Bar bar недопустимо, поскольку вы пытаетесь использовать class bar;, который предоставляет неполный тип.

Вы также не включаете Bar.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...