2013-04-23 2 views
1

У меня есть немного кода следующего формата, содержащегося в одном .h и .cc файла:выкладывания методы класса в различных .cc файл

myClass.h:

#ifndef MYCLASS_H 
#define MYCLASS_H 
class myClass 
{ 
public: 
    myClass(); // constructor 
    ~myClass(); // destructor 

    void classMethod1(); 
    void classMethod2(); 

    int memberVarable1; 
    int memberVariable2; 
}; 
#endif 

и MyClass .cc:

#include "myClass.h" 
myClass::myClass(){ 
// stuff 
} 

myClass::~myClass(){ 
// stuff 
} 

void myClass::classMethod1(){ 
// stuff 
} 

void myClass::classMethod2(){ 
// stuff 
} 

Все это работает нормально. Однако мой проект становится довольно большим, и я собираюсь добавить набор новых функций. Вместо того, чтобы забивать myClass.h и myClass.cc, я хочу поместить некоторые новые методы в другой .cc-файл. Кажется, я не могу заставить это работать.

myClass.h:

#ifndef MYCLASS_H 
#define MYCLASS_H 

#include "secondFile.h" 

class myClass 
    { 
    public: 
     myClass(); // constructor 
     ~myClass(); // destructor 

     void classMethod1(); 
     void classMethod2(); 

     int memberVarable1; 
     int memberVariable2; 
    }; 
#endif 

и myClass.cc:

#include "myClass.h" 
#include "secondFile.h" 
myClass::myClass(){ 
// stuff 
} 

myClass::~myClass(){ 
// stuff 
} 

void myClass::classMethod1(){ 
// stuff 
} 

void myClass::classMethod2(){ 
// stuff 
} 

secondFile.h:

#ifndef SECONDFILE_H 
#define SECONDFILE_H 

void someNewMethod(); 

#endif 

secondFile.cc

#include "secondFile.h" 
void someNewMethod(){ 
// can't see classMethod1() 
} 
+1

Определить, как это: недействительного MyClass :: classMethod1() {// вещь } недействительного MyClass :: classMethod2() {// материала } –

+0

Я вижу много проблем , но я уверен, что многие из этих проблем не в вашем реальном коде, это просто ошибки, которые вы сделали, переписывая свой настоящий код на этот пост. Поэтому, пожалуйста, исправьте сообщение, так что это похоже на ваш реальный код. В противном случае вы получите ответы, которые не имеют никакого отношения к вашей реальной проблеме. – john

+0

Также вы используете make-файл? –

ответ

3

В каждом исходном файле вам нужно включить каждый заголовочный файл, который объявляет функции и т. Д., Которые вы хотите использовать.

Так что в вашем случае, кажется, что вы хотите secondFile.cc содержать

#include "myClass.h" 
#include "secondFile.h" 
void someNewMethod(){ 
// can't see classMethod1() 
} 

Btw, что вы делаете, это довольно часто, чтобы сделать на практике. Иногда я иду еще дальше, чем предлагаю, и реализую различные методы одного класса в нескольких исходных файлах. Для больших сложных классов это ускоряет цикл разработки, потому что мне нужно только перекомпилировать часть реализации класса, если я сделал только небольшое изменение. Пример:

myclass.h

#pragma once 

class MyClass 
{ 
    ... 
    void complicatedMethod0(); 
    void complicatedMethod1(); 
    ... 
}; 

myclass_impl0.cpp

#include "myclass.h" 

void MyClass::complicatedMethod0() 
{ 
    ... 
} 

myclass_impl1.cpp

#include "myclass.h" 

void MyCLass::complicatedMethod1() 
{ 
    ... 
} 
+0

Отлично! могу ли я (должен ли я) поместить объявления метода в файл secondFile.h или сохранить все в myClass.h? – tir38

+0

@ tir38 Это зависит от многого. Если вы добавляете методы в свой класс, они должны находиться в том же заголовочном файле. Вы не можете распространять объявление класса по нескольким заголовочным файлам. В противном случае сделайте все, что лучше для вас. –

+0

* «В каждом исходном файле вам нужно включить каждый заголовочный файл, который определяет функции и т. Д., Которые вы хотите использовать». * - это неверно, требуются только объявления функций - поиск определений - это работа компоновщика. Они также не должны быть в заголовочных файлах, вы можете переслать объявление. – JBentley

0
#include "secondFile.h" 
#include "myClass.h" 
//if you want the class methods, 
//you need to tell the compiler where to look 
void someNewMethod(){ 
// can't see classMethod1() 
} 

, кажется, вы забыли включить «MyClass. час".

1

Если вы намереваетесь , то добавьте методам в myClass, вы не можете этого сделать - методы класса должны содержаться в одном определении.

Вы можете продлитьmyClass, однако, наследуемых от него:

secondFile.h:

#ifndef SECONDFILE_H 
#define SECONDFILE_H 

#include "myClass.h" 

class mySecondClass : public myClass 
{ 
    public: 
     void someNewMethod(); 
} 
#endif 

secondFile.куб.см

#include "secondFile.h" 
void mySecondClass::someNewMethod(){ 
    this.classMethod1(); 
} 
+0

Таким образом, один экземпляр myClass может создать один экземпляр mySecondClass. Затем экземпляр mySecondclass знает обо всех общедоступных и защищенных (но не частных) методах и переменных экземпляра myClass? – tir38

+1

Нет, это тот же пример. Это и «mySecondClass', и« myClass ». Точно так же Жираф - это млекопитающее и животное. Прочитайте о наследовании, чтобы лучше понять. –

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