2011-09-30 66 views
1

我想在运行我的应用程序时更改“值”。 但是当我打电话RS232 :: PackageRecived在 “RS232.cpp” 我恢复了这个错误:类中的调用函数

错误1个错误C2352: 'RS232 :: PackageRecived':非静态成员的非法调用

//////////////////////////////////////////// RS232.cpp FILE 

#include "RS232.h" 
void RS232::PackageRecived() 
{ 
value =123; 
} 
void TryCallPackageRecived() 
{ 
RS232::PackageRecived(); // my compiler error is here 
} 
int RS232::Connect() 
{ 
TryCallPackageRecived(); 
} 
RS232::RS232(void) 
{ 
} 
RS232::~RS232(void) 
{ 
} 
////////////////////////////////////////////  RS232.h File 
class RS232 
{ 
public: 
int value; 
int Connect(); 
void PackageRecived(); 
RS232(void); 
~RS232(void); 
}; 
//////////////////////////////////////////// Main.cpp File 
#include "RS232.h" 
RS232 RS; 
int main() 
{ 
RS.Connect(); 
} 
+0

Recived - > Recieved – David

回答

1

您的函数“TryCallPackageRecived()”不是RS232类的成员。它试图调用不是静态的RS232成员函数。这是不允许的。当你想调用一个非静态成员函数时,你需要在特定的对象上调用它。

在这种情况下,你可以这样做:

RS.PackageRecived(); 

如果你想允许多个对象,你可以修改你的TryCallPackageRecived功能采取的指针RS232对象:

void TryCallPackageRecived(RS232 *ptr) 
{ 
    if(ptr != 0) 
     ptr->PackageRecived(); 
} 

... more code ... 

int RS232::Connect() 
{ 
    TryCallPackageRecived(this); 
} 
+0

'RS.PackageRecived();'不起作用,因为'RS'没有在该范围内定义。指针方法应该工作。 – Johnsyweb

+0

哇工作,谢谢^ \^ –

0

这是因为PackageRecived不是一个静态方法,你不能在没有对象的情况下调用非静态方法。

要么让它成为一个静态方法(但它取决于你的逻辑)或者直接调用它,因为你仍然在这个类中。

void TryCallPackageRecived() 
{ 
    PackageRecived(); // my compiler error is here 
} 
+0

这不是最好的方法 - 它假定他想使用全局实例RS,并且机会对于实际使用情况来说不会是期望的行为。 –

+0

@LaceySnr:更新了答案。 – Aamir

+0

为您推选。 –

0

解决此问题的显而易见的方法是将TryCallPackageRecived()添加到您的RS232类中:

////////////////////////////////////////////  RS232.h File 
class RS232 
{ 
public: 
    int value; 
    int Connect(); 
    void PackageRecived(); 
    void TryCallPackageRecived(); 
    RS232(); 
    ~RS232(); 
}; 

//////////////////////////////////////////// RS232.cpp 

// [...]  
void RS232::TryCallPackageRecived() 
{ 
    PackageRecived(); 
} 
// [...]  
+0

谢谢你这个另一个真实的方式^ |^ –

+0

@Mantro:不用担心。 – Johnsyweb