我有两个文件:
File1.cpp
File2.cpp
File1是我的主类,它有main方法,File2.cpp有一个类调用ClassTwo,我想在File1.cpp中创建一个ClassTwo对象
我一起编译它们
g++ -o myfile File1.cpp File2.cpp
但是当我尝试创造时
//创建第二类对象
ClassTwo ctwo;
它不起作用.
错误是
ClassTwo未在此范围内声明.
这是我的main.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
//here compile error - undeclare ClassTwo in scope.
ClassTwo ctwo;
//some codes
}
这是我的File2.cpp
#include <iostream>
#include <string>
using namespace std;
class ClassTwo
{
private:
string myType;
public:
void setType(string);
string getType();
};
void ClassTwo::setType(string sType)
{
myType = sType;
}
void ClassTwo::getType(float fVal)
{
return myType;
}
得到了将我的File2.cpp拆分成另一个.h文件的响应但是如果我声明一个类,我如何将它拆分成另一个.h文件,因为我需要维护变量(私有)和函数的公共和私有(公共) )如何在main方法中将ClassTwo ctwo转换为File1.cpp
Alo*_*ave 45
您的代码中的基本问题是什么?
您的代码需要分离到接口(.h)和实现(.cpp).
编写类似的东西时,编译器需要查看类型的组合
ClassTwo obj;
这是因为编译器需要为类型的对象保留足够的内存ClassTwo来执行此操作,因此需要查看其定义ClassTwo.在C++中执行此操作的最常见方法是将代码拆分为头文件和源文件.
类定义进入头文件,而类的实现进入源文件.通过这种方式,可以轻松地将头文件包含到其他源文件中,这些源文件需要查看他们创建的对象类的定义.       
为什么我不能简单地将所有代码放在cpp文件中并将它们包含在其他文件中?
您不能简单地将所有代码放在源文件中,然后将该源文件包含在其他文件中.C++标准要求您可以根据需要多次声明实体,但只能定义一次(一个定义规则(ODR)) .包含源文件会违反ODR,因为在包含该文件的每个翻译单元中都会创建该实体的副本.
如何解决这个特殊问题?
您的代码应按如下方式组织:
// File1.h
Define ClassOne 
// File2.h
#include <iostream>
#include <string>
class ClassTwo
{
private:
   string myType;
public:
   void setType(string);
   std::string getType();
}; 
//File1.cpp
#include"File1.h"
Implementation of ClassOne 
//File2.cpp
#include"File2.h"
void ClassTwo::setType(std::string sType)
{
    myType = sType;
}
void ClassTwo::getType(float fVal)
{
    return myType;
} 
//main.cpp
#include <iostream>
#include <string>
#include "file1.h"
#include "file2.h"
using namespace std;
int main()
{
    ClassOne cone;
    ClassTwo ctwo;
    //some codes
}
有没有其他方法,而不是包括头文件?
如果您的代码只需要创建指针而不是实际对象,那么您也可以使用正向声明,但请注意,使用正向声明会对如何使用该类型添加一些限制,因为编译器会将该类型视为不完整类型.
S.C*_*sen 10
C++(和C就此而言)拆分了类型,函数和类的"声明"和"实现".您应该在头文件(.h或.hpp)中"声明"所需的类,并将相应的实现放在.cpp文件中.然后,当您希望在某处使用(访问)类时,#include相应的头文件.
例
ClassOne.hpp:
class ClassOne
{
public:
  ClassOne(); // note, no function body        
  int method(); // no body here either
private:
  int member;
};
ClassOne.cpp:
#include "ClassOne.hpp"
// implementation of constructor
ClassOne::ClassOne()
 :member(0)
{}
// implementation of "method"
int ClassOne::method()
{
  return member++;
}
main.cpp中:
#include "ClassOne.hpp" // Bring the ClassOne declaration into "view" of the compiler
int main(int argc, char* argv[])
{
  ClassOne c1;
  c1.method();
  return 0;
}
| 归档时间: | 
 | 
| 查看次数: | 96403 次 | 
| 最近记录: |