Объявление переменной-члена, которая принимает параметр конструктора - PullRequest
3 голосов
/ 13 сентября 2011
 // 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' дает мне ошибку компиляции с использованием компилятора g ++: error: 'A :: eOne' не является типом

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

Ответы [ 4 ]

8 голосов
/ 13 сентября 2011

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

class B
{
public:
    B() : memberA(A::eOne) {}  // Initializer list in constructor
private:
    A memberA;
};
1 голос
/ 13 сентября 2011

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 всегда вызывается с аргументом как A::eOne. Вы не показали, как этот аргумент используется в конструкторе, но я предполагаю, что в вашем реальном коде он инициализирует член A. Если член должен всегда иметь одно и то же значение, сделайте его const и удалите параметр из конструктора.

1 голос
/ 13 сентября 2011
class B
{
    public:
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};

    private:   
    A memberA;
}
0 голосов
/ 13 сентября 2011

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

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