2011-09-30 65 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