0

我有一个在 c 文件中创建 c++ 对象的查询。

我有下面的示例代码。尝试导入 CPlusHeader 时会引发我无法理解的错误。

错误是找不到 iostream 的文件作为错误之一。我该如何解决这个问题。

问候,列宁

CPlusFile.h

include iostream

include string

using namespace std;

class  CPlusFile {
  int data;
public:
  CPlusFile();
  int getData();
};

CPlusFile.cpp

CPlusFIle::CPlusFIle() {
  data = 10;
}

int CPlusFile::getData() {
  return data;
}

C文件.h

int doSomething();

C文件.c

include "CFile.h"

include "CPlusFile.h"

int doSomething() {
  CPlusFile object; 

}
4

5 回答 5

3

这在很大程度上取决于您所说的“C 文件”。上一个答案假设您的意思是带有 .c 后缀的文件。我在这里假设您的意思是应使用 C 编译器编译的文件。

如果我的假设成立,那么答案很简单:您不能在 C 文件中实例化 C++ 类。但是,您可以做的是从 C 代码中调用 C++ 静态方法。例如,请参考In C++ source, extern "C" 的作用是什么?看看如何做到这一点。

于 2013-10-21T09:27:48.380 回答
1

首先,它是

#include <iostream>
#include <string>

并不是

include iostream
include string

其次,如果 CFile.c 被编译为 C,那么这将不起作用。C 编译器无法理解 class 关键字,因此您无法在 C 中创建类的实例。

于 2013-10-21T09:35:42.717 回答
0

是的,可以在 C 文件中调用 C++ 对象。在这里,我执行了一个场景,
它对我来说工作正常。

 CPlusFile.h 

  #include<iostream>
  #include<string>
     using namespace std;
       class cplus{

                int data;
                public:
                       cplus();
                        int getdata();

       };

   CPlusFile.cpp

      #include "cplusfile.h"
       cplus::cplus(){  data =10; }
       int cplus::getdata(){ return data; }


   CFile.h

     #include "cplusfile.h"
     #include<stdio.h>
           int dosomething();

 CFile.c

       #include "cfile.h"
        int dosomething(){

                cplus c;
                  printf("%d",c.getdata());


           }

     int main() {
                dosomething(); 
                return 0;
          }



     And compile this by g++ CFile.c CPlusFile.cpp and it works fine.
于 2013-10-21T09:37:55.390 回答
0

您可以在 C++ 头文件中使用它来检查您是否要从 C 或 C++ 代码中包含它:

#ifdef __cplusplus

includeiostream和其他以及 usingclass仅适用于 C++ 代码。

但是如果你想使用这个CPlusFile类,它是一个 C++ 类,你只能在 C++ 代码中做到这一点。最好的是将你的重命名CFile.cCFile.cpp.

于 2013-10-21T09:31:58.853 回答
0

iostream是 C++ 头文件,如果您使用 C 编译器进行编译,则不可用。您可以在文件中编写 C++ 代码.c,您只需要使用正确的编译器。

于 2013-10-21T09:16:22.193 回答