2015-05-20 3 views
3

я в настоящее время есть два неназванных классы определены в моем foo.h:Определение функций имени неназванного класса?

class Foo { 
public: 
    Foo(); 

    class { 
    private: 
     int x; 
     int y; 
    public: 
     int GetX() { return x; } 
     int GetY() { return y; } 
    } Sub1; 

    class { 
    private: 
     int x; 
    public: 
     int GetX() { return x; } 
    } Sub2; 
} 

Этот код компилируется нормально, и он используется так:

Foo temp; 
int Ax, Ay, Bx; 
Ax = temp.Sub1.GetX(); 
Ay = temp.Sub1.GetY(); 
Bx = temp.Sub2.GetX(); 

Однако, теперь я хочу, чтобы переместить элемент определения функций к исходному file.The только так, как я знаю, чтобы разделить этот класс в файл заголовка файла и источника, чтобы назвать классы:

foo.h:

class Foo { 

private:  
    class A { 
    private: 
     int x; 
     int y; 
    public: 
     int GetX(); 
     int GetY(); 
    }; 

    class B { 
    private: 
     int x; 
    public: 
     int GetX(); 
    }; 

public: 
    Foo(); 
    A Sub1; 
    B Sub2; 

} 

foo.cpp:

int Foo::A::GetX() { return x; } 
int Foo::A::GetY() { return y; } 
int Foo::B::GetX() { return x; } 

Этот код не то, что я хочу, однако, так как это некрасиво, и я не хочу с именем класса, в первую очередь.

Можно ли разбить класс на заголовочный файл и исходный файл? Или это просто плохой дизайн кода?

+0

Рассмотрите возможность использования структур, если Sub1 и Sub2 будут только членами данных Foo. Затем вы можете удалить необходимость в функциях Get. – timato

+1

Если ваши внутренние классы становятся больше, чем '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

Если вы используете неназванные внутренние классы, как компилятор знает, какую функцию GetX использовать? Вы не можете ссылаться на имя класса, так как его нет. –

ответ

1

Это, к сожалению, невозможно. §9.3/5:

Если определение функции члена лексически вне его определения класса , имя функции члена квалифицируется по имени класса с использованием оператора ::.

Поскольку имя класса не существует, не допускаются определения вне класса для функций-членов. Тот факт, что GCC разрешает спецификаторы decltype в этом контексте, является ошибкой.

0

Возможно, вы должны переместить внутренние классы реализации в свои собственные namespace.

Начиная с исходным кодом:

class Foo { 
public: 
    Foo(); 

    class { 
    private: 
     int x; 
     int y; 
    public: 
     int GetX() { return x; } 
     int GetY() { return y; } 
    } Sub1; 

    class { 
    private: 
     int x; 
    public: 
     int GetX() { return x; } 
    } Sub2; 
}; 

Вы можете изменить его на:

namespace detail{ 
    class A 
    { 
    public: 
     getX(); 
    }; 

    class B 
    { 
    public: 
     getX(); 
    }; 
} 

class Foo { 
public: 
    Foo(); 

    int getAX(); 
    int getAY(); 

private: 
    A a; 
    B b; 
}; 

И теперь вы свободны двигаться реализации в CPP:

namespace detail{ 
int A::getX(){ 
    ... 
} 

int B::getX(){ 
    ... 
} 
} 

Foo::Foo() { 

} 

int Foo::getAX() { 
    ... 
    return a.getX(); 
} 
Смежные вопросы