2010-01-18 2 views
1

Мне было интересно, есть ли способ поместить объекты класса в заголовок?Можно ли добавить объект класса в заголовок класса?

Например:

class MyClass { 

} object; 

Если я сделал объект там, а затем включить заголовок в более чем одного исходного файла, я получаю ошибку умножения определенных символов, найденных. Я новичок, поэтому не понимаю полностью все.

Кроме того, я хочу сделать что-то вроде object.function() внутри другой функции, которая является членом другого класса, как я могу это сделать?

ответ

4

Предполагая, что вы хотите, один объект, в заголовочном файле просто объявить объект:

extern blabla object; 

, а затем в один исходный файл определить его:

blabla object; 

Как для вызова метода на объект из другого класса, что отлично, если этот метод является общедоступным.

class foo 
{ 
public: 
    void public_method(); 

private: 
    void private_method(); 
}; 


void some_other_class::method(foo &f) 
{ 
    f.public_method(); // this is fine 

    f.private_method(); // this is not okay, private_method can only be called from 
         // within foo 
} 

Существует также третья видимость (защита), которая вступает в игру после того, как вы начнете заниматься наследованием.

1

Вы можете найти способы сделать это (см. Другие ответы), но просто не делайте этого. Как вы сказали, вы новичок в C++, поэтому лучше изучите хорошие практики, а когда вам нужны глобальные объекты - создайте их в исходном (cpp) файле.

Кроме этого, попробуйте вообще не использовать глобальные объекты и определить свои объекты внутри классов или функций.

-1

Вы также можете использовать шаблон singleton, если это вам подходит в этом случае.

Для вашего второго вопроса. Вы всегда можете сделать объект класса переменной (private) членом класса, из которого вы хотите вызвать object.function().

Например:

// File a.h, includeguards etc. left out for clarity 
class A { 
public: 
    void func(); 
}; 

// File b.h 
#include "a.h" 
class B { 
public: 
    void func(); 
private: 
    A object; 
}; 

// File b.c 
#include "b.h" 
void B::func() 
{ 
    object.func(); 
} 

Надежда, что помогает.

+1

Я бы не рекомендовал шаблон одноэлементный на всех; нет случаев, когда это необходимо. – GManNickG

+0

Хмм, спасибо - ваш комментарий заставил меня сделать обширный поиск Google для аргументов «за» и «против», после поиска и чтения многих статей я нашел неплохую дискуссию по вики с многочисленными интересными комментариями и ссылками: http://c2.com/cgi/ вики? SingletonPattern. Мой вывод: дайте ему очень-очень-очень хорошую мысль, прежде чем использовать ее. Но иногда это имеет смысл.И вы правы, это нигде не требуется - но это не шаблон. –

0

Неправильно применять определения в заголовочных файлах, так как это приведет к ошибке, с которой вы столкнулись. Хотя есть способы обойти это (extern, head guard), его следует избегать как можно больше. Просто запомните, поместите объявления в заголовочные файлы, определения в исходные файлы.

0

О втором вопросе обратите внимание, вы также можете вызвать статический метод с помощью :: оператора и имя класса (без экземпляра):

void AnOtherClass::method() 
{ 
    TheFirstClass::static_method(); 
} 
Смежные вопросы