2011-09-12 4 views
3
// In A.h 
class A 
{ 
    public: 
    enum eMyEnum{ eOne, eTwo, eThree }; 
    public: 
    A(eMyEnum e); 
} 

// In B.h 
#include "A.h" 
class B 
{ 
    B(); 
    private: 
     A memberA; 
} 

// In B.cpp 
#include "B.h" 
B::B(void) : memberA(A::eOne) 
{} 

Декларация на «memberA» дает мне ошибку компиляции с помощью компилятора г ++: ошибка: «A :: eOne» не является типомОбъявляя переменную-член, которая принимает параметр конструктора

Как может Я это преодолею? Мне просто нужно создать конструктор по умолчанию, который не принимает никаких параметров?

+0

Является ли 'memberA' членом переменной или членом? –

+0

memberA должен быть переменной-членом –

ответ

8

Похоже, вы пытаетесь инициализировать переменную-член. Вы могли бы сделать что-то вроде:

class B 
{ 
public: 
    B() : memberA(A::eOne) {} // Initializer list in constructor 
private: 
    A memberA; 
}; 
+0

Спасибо! Я пробовал это раньше, но он дает мне ошибки ссылок: Неопределенная ссылка на «A :: A (A :: eOne), хотя у меня есть определение для нее. –

+0

@lost_bits: Ну, это другая проблема. Отредактируйте сообщение, чтобы включить свой * фактический * код ... –

+0

Спасибо - я обновил свой код выше. –

0

eOne не тип, тип eMyEnum. Вы, по сути, говорите, что «вы должны передать литерал 2 в этот метод» - это не имеет никакого смысла. Если вы не имеете в виду перечислить в него перечисление, вам нужно будет уточнить, что вы собираетесь делать.

+0

Дело в том, что я пытаюсь передать enum в memberA, поскольку для этого требуется конструктор класса A. –

1
class B 
{ 
    public: 
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {}; 

    private: 
    A memberA; 
} 
+0

hmm - к сожалению, я не хочу изменять конструктор для класса B, поскольку это не имеет смысла в моем конкретном дизайне. –

+0

вам придется изменить конструктор для класса B, потому что здесь вы должны инициализировать memberA. Подумайте об этом - в какой другой точке элемент был бы инициализирован, если не во время построения B? Избавьтесь от аргумента, если вам это не нравится, но он ничего не сломает, и это действительно единственный способ сделать это. – sqykly

1

A конструктор ожидает eMyEnum. Непонятно, почему вы хотите, чтобы конструктор B не принимал параметр eMyEnum. В любом случае, при условии, что, что ваша цель состоит в том, чтобы передать аргумент A в качестве конструктора A::eOne (в отличие от A::eMyEnum::eOne), вы можете попробовать следующий код, который использует typedef.

#include <iostream> 
using namespace std; 

class A { 
public: 
    typedef enum { eOne, eTwo, eThree } eMyEnum; 
public: 
    A(eMyEnum e) { 
     cout << "A ctor" << endl; 
    } 
}; 

class B { 
public: 
    B() : memberA(A::eOne) { 
     cout << "B ctor" << endl; 
    } 
private: 
    A memberA;  

}; 

int main() { 
    B b; 
} 

// output 
A ctor 
B ctor 

Однако, обратите внимание, что memberA «s конструктор всегда вызывается с аргументом, как A::eOne. Вы не показали, как этот аргумент используется в конструкторе, но я полагаю, что в вашем реальном коде он инициализирует член A. Если член всегда должен иметь одинаковое значение, сделайте его const и удалите параметр из конструктора.

+0

спасибо, да это сработает! Я закончил тем, что принял ответ Оли, хотя он был первым. Спасибо, хотя, оцените! –

+0

Я рад, что вы сочли это полезным. Не стоит беспокоиться о принятии ответа. Просто я живу в другом часовом поясе. Невезение! –

Смежные вопросы