如何从C ++ / CLI代码调用C ++代码?

时间:2013-07-01 07:29:00

标签: c++ .net visual-studio-2010 class visual-c++

我在visual studio 2010专业版中创建了一个C ++ / CLI(Visual C ++)项目。然后我在项目中添加了一个非常小的C ++类。 Followng是代码

#include <stdafx.h>
#include <iostream>

using namespace std;

    class Tester
    {

    public:
        Tester(){};

        void show()
        {
            cout << "OKOK..Printing" << endl;
        }

    };

现在,我将一个按钮拖放到自动构建的GUI表单中,我即将从按钮调用上面的代码。以下是按钮的代码。

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Tester ^t = gcnew Tester();
                             //Test t; - giving errors as well

             }
    };

当我执行代码时,出现以下错误

1>------ Build started: Project: testdamn, Configuration: Debug Win32 ------
1>Build started 7/1/2013 12:59:38 PM.
1>InitializeBuildStatus:
1>  Touching "Debug\testdamn.unsuccessfulbuild".
1>GenerateTargetFrameworkMonikerAttribute:
1>Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>ClCompile:
1>  All outputs are up-to-date.
1>  Test.cpp
1>  testdamn.cpp
1>c:\users\yohan\documents\visual studio 2010\projects\testdamn\testdamn\Form1.h(79): error C2065: 'Tester' : undeclared identifier
1>c:\users\yohan\documents\visual studio 2010\projects\testdamn\testdamn\Form1.h(79): error C2065: 't' : undeclared identifier
1>c:\users\yohan\documents\visual studio 2010\projects\testdamn\testdamn\Form1.h(79): error C2061: syntax error : identifier 'Tester'
1>  Generating Code...
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.86
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我还注意到当我从按钮中删除类调用时,程序构建正常。那么,我如何从C ++ / CLI调用这些C ++类?

1 个答案:

答案 0 :(得分:4)

查看您收到的编译器错误:

1>c:\...\testdamn\Form1.h(79): error C2065: 'Tester' : undeclared identifier
1>c:\...\testdamn\Form1.h(79): error C2065: 't' : undeclared identifier
1>c:\...\testdamn\Form1.h(79): error C2061: syntax error : identifier 'Tester'

编译器告诉您它找不到任何名为Tester的类,因此无法使用它。

为了使用您的Tester类,您需要在包含Form类定义的文件中包含包含其定义的头文件。这与您必须包含iostream标头以使用std::cout的方式相同。

但是一旦你解决了这个问题,你就会遇到另一个问题:你正在尝试使用gcnew来实例化Tester,这是一个非托管类。 gcnew旨在实例化托管的类,并从托管堆中分配内存。您希望使用常规C ++ new运算符来实例化常规C ++非托管类。一旦编译器能够看到Tester类的定义,它就会注意到这种不匹配并产生另一个错误。