2013-04-25 75 views
0

如何在Windows VS2010中做到這一點?C++實現在dll外定義的虛擬類,在dll中

2個項目在同一個解決方案下:第一個是定期控制檯應用程序,帶有兩個文件:s.h和j.cpp。第二個項目是一個DLL應用與一個頭文件:JH

SH:

#ifndef M 
#define M 

class MyMathFuncs 
    { 
    public: 
     // Returns a + b 
     virtual double Add(double a, double b) const = 0; 

     // Returns a - b 
     virtual double Subtract(double a, double b) const = 0; 

     // Returns a * b 
     virtual double Multiply(double a, double b) const = 0; 

     // Returns a/b 
     // Throws const std::invalid_argument& if b is 0 
     virtual double Divide(double a, double b) const = 0; 
    }; 

double MyMathFuncs::Add(double a, double b) const{}; 

     // Returns a - b 
double MyMathFuncs::Subtract(double a, double b) const{}; 

     // Returns a * b 
double MyMathFuncs::Multiply(double a, double b) const{}; 

     // Returns a/b 
     // Throws const std::invalid_argument& if b is 0 
double MyMathFuncs::Divide(double a, double b) const{}; 

j.cpp:

#include "s.h" 
#include "j.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 
    double a = 7.4; 
    int b = 99; 
    MyMathFuncs2 k; 
    cout << "a + b = " << 
     k.Add(a, b) << endl; 
    cout << "a - b = " << 
     k.Subtract(a, b) << endl; 
    cout << "a * b = " << 
     k.Multiply(a, b) << endl; 
    cout << "a/b = " << 
     k.Divide(a, b) << endl; 

    try 
    { 
     cout << "a/0 = " << 
      k.Divide(a, 0) << endl; 
    } 
    catch (const invalid_argument &e) 
    { 
     cout << "Caught exception: " << e.what() << endl; 
    } 
    char c; 
    cin >> c; 
    return 0; 
} 
在DLL

,JH:

#ifndef dllheader 
#define dllheader 

#include "s.h" 
#include <stdexcept> 

class MyMathFuncs2: public MyMathFuncs { 

public: 
    __declspec(dllexport) double Add(double a, double b) const { 
     return a + b; 
    } 

     // Returns a - b 
    __declspec(dllexport) double Subtract(double a, double b) const { 
     return a - b; 
    } 

     // Returns a * b 
    __declspec(dllexport) double Multiply(double a, double b) const { 
     return a * b * b * b; 
    } 

     // Returns a/b 
     // Throws const std::invalid_argument& if b is 0 
    __declspec(dllexport) double Divide(double a, double b) const { 
     if (b == 0) 
     { 
      //throw invalid_argument("b cannot be zero!"); 
     } 

     return a/b; 
    } 
} 



#endif 

的DLL編譯,但控制檯應用程序不:

files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(36): error C2236: unexpected 'struct' '__type_info_node'. Did you forget a ';'? 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(36): error C2143: syntax error : missing ';' before '{' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(36): error C2447: '{' : missing function header (old-style formal list?) 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(41): error C2146: syntax error : missing ';' before identifier '__type_info_root_node' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(41): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(41): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(67): error C2061: syntax error : identifier '__type_info_node' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo(74): error C2061: syntax error : ide 

回答

1

在你class MyMathFuncs2定義的j.h末,看到這一點:

} 

嘗試將其更改爲:

}; 
+0

至少現在編譯問:「難道你忘了 ';'? 「舊版本打印了數十個奇怪的錯誤,沒有任何希望或指導。 :) – Eugene 2013-04-25 22:18:27

+0

@Eugene沒有開玩笑。必須是一個編碼器,將其放入功能集。 – WhozCraig 2013-04-25 22:19:19

+0

@WhozCraig謝謝 – 2013-04-25 22:20:25