2009-11-06 3 views
0

im борется с синтаксисом здесь: надеюсь, этот вопрос v прост, им просто мизирует точка.очень простой вопрос C++ oop

конкретно, если я гнездо класса внутри другого класса, так, например,

class a 
{ 
    a //the constructor 
    { 
     b an_instance_of_b // an instance of class b 
    } 
}; 

class b 
{ 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

Когда я пытаюсь достигнуть этого метода в B, делая это:

a an_instance_of_a; //declare an instance of a 
an_instance_of_a.an_instance_of_b.foo() 

^^ это не кажется работать. это упрощается (так может быть опечатка здесь где-то). но я знаю, что классы настраиваются отлично, а именно, что я не могу получить доступ к методам внутри них, если они вложены. что я могу делать неправильно?

много спасибо.

ответ

3

Ваш an_instance_of_b не является членом a, но локальная переменная в конструкторе (и в объявлении конструктора отсутствует скобка).

Что произойдет, так это то, что при создании экземпляра a он создает и немедленно уничтожает экземпляр b, затем он оставляет конструктор для a и создается экземпляр.

+0

, что действительно было проблемой! Я попробовал пару решений, но в конце (размещение здесь для потомков): самым простым методом было на самом деле создать указатель на класс b в классе a, а затем вызвать его из основной функции (с помощью оператора -> по мере необходимости) – ohnoitslateandiwanttosleep

0

Я не вижу класс, вложенный в другой класс.

Я вижу класс «a» с точкой с запятой, прежде чем начать «b». Следовательно, нет гнездования.

EDIT

Я переформатировать свой код, чтобы сделать ясно, где занятия начинаются/конец.

У вас не хватает запятой после b an_instance_of_b

Конструктор a является частным по умолчанию. Я думаю, вам нужен конструктор public.

EDIT 2

Я думаю, что это код, который вы хотите:

class b; // forward declare "b" so that it is valid in class "a" 

class a 
{ 
    public: 
    a(void) //Constructor is now public. 
    { 
     // Empty body. There is now a member variable 
    } 

    public: 
     b a_member_instance_of_b; 
}; 

class b 
{ 
    // Note: no constructor. 
    public: 
    foo() 
    { 
     cout << "foo"; 
    } 
}; 

int main(void) 
{ 
    a an_instance_of_a; 
    an_instance_of_a.a_member_instance_of_b.foo(); 
    return 0; 
} 
+0

lol. я шудл просто ложись спать! Я передумал в середине пути об именах. это должно быть a и b. Извинения. я совершенно жалкий – ohnoitslateandiwanttosleep

1

Попробуйте это:

class B; // prototype declaration 

class hello { 
    hello() { //the constructor 
     B an_instance_of_b; // an instance of class b 
    } 
}; 

class B { 
public: 
    void foo() { 
     cout << "foo"; 
    } 
}; 

Во-первых, они не вложены в вашем примере. Во всяком случае, нет никакой очевидной необходимости.

Во-вторых, были некоторые ошибки описания функций и данных.

Наконец, вам нужен прототип B, так что объявление hello::an_instance_of_b может работать в качестве прямой ссылки. Или просто объявите B до hello.

1

Это работает для меня с г ++ на Linux:

#include <iostream> 

using namespace std; 

class B { 
public: 
     void foo() { 
       cout << "foo" << endl; 
     } 
}; 

class A { 
public: 
     B b; 
}; 

int main() { 
     A a; 
     a.b.foo(); 
} 

Я думаю, б может быть просто частным в вашем случае.

1

Попробуйте ввести точный код, который компилирует & работает. Вы можете вырезать ненужные функции, но приведенный выше код даже не будет компилироваться, поэтому очень сложно решить проблему.

Однако, принимая удар, an_instance_of_b по умолчанию защищен, не так ли? Это означает, что вы не сможете получить доступ к нему за пределами класса. Также, судя по вашему опубликованному коду, an_instance_of_b даже не является переменной класса, это локальная переменная внутри конструктора. Вам нужно будет добавить Getter для извлечения экземпляра. Возможно, что-то вроде этого (я еще не сделал C++ на некоторое время):

class ClassA 
{ 
    public: 
    hello() { _ClassB = new ClassB(); } 
    ClassB GetClassB() { return _ClassB; } 
    private: 
    ClassB _ClassB; 
} 

class ClassB 
{ 
    public: 
    foo() {} 
} 

void SomeRandomFunction() 
{ 
    ClassA classA = new ClassA(); 
    classA.GetClassB().foo(); 
}