2015-02-06 71 views
0

作爲我創建的類的一部分,我有一個表示常量緩衝區的結構。在接口文件(.h文件)中有一個getter函數,其返回類型與結構的相同。 .h文件中的函數原型被編譯器很好地識別,但是在函數定義中的實現文件(.cpp文件)中,編譯器將函數的返回類型用紅色標出,表示它是未定義的。頭文件包含在.cpp文件中,所以我不確定爲什麼函數的返回類型無法識別。下面是代碼:編譯器不識別實現文件中的類成員函數類型,但在接口文件中識別

對於頭文件:

#ifndef _PLAYERCLASS_H_ 
#define _PLAYERCLASS_H_ 

//Std library includes 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string> 
#include <math.h> 
#include <vector> 
#include <memory> 
#include <d3d11.h> 
#include <d3dx11.h> 
#include <d3dx10.h> 

// include the Direct3D Library file 
#pragma comment (lib, "d3d11.lib") 
#pragma comment (lib, "d3dx11.lib") 
#pragma comment (lib, "d3dx10.lib") 

class PlayerClass 
{ 
private: 

// a struct to define the constant buffer 
struct CBUFFER 
{ 
    D3DXMATRIX Final; 
    D3DXMATRIX Rotation; 
    D3DXVECTOR4 LightVector; 
    D3DXCOLOR LightColor; 
    D3DXCOLOR AmbientColor; 
}; 

public: 

//Functions 
PlayerClass();  //Constructor 
~PlayerClass();  //Destructor 

//Functions to set up player 

//Getters 
CBUFFER constBuff();     //Return the constant buffer 

//Setters 



private: 

//Some private member variables 

//Constant buffer to contain alterations to player etc 
CBUFFER pUpdates; 


}; 

#endif 

對於cpp文件:

#include "Player.h" 
#include <Windows.h> 
PlayerClass::PlayerClass() 
{ 
    pUpdates.LightVector = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 0.0f); 
    pUpdates.LightColor = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f); 
    pUpdates.AmbientColor = D3DXCOLOR(0.6f, 0.6f, 0.6f, 1.0f); 

} 

PlayerClass::~PlayerClass() 
{ 

} 

void PlayerClass::initPlayer() 
{ 

} 

CBUFFER PlayerClass::constBuff() 
{ 
    return pUpdates; 
} 

沒有正在識別的功能是最後的功能特別是CBUFFER一部分以紅色加下劃線。

+1

嘗試'PlayerClass :: CBUFFER PlayerClass :: constBuff()' – 2015-02-06 00:43:03

+0

這樣做 - 請問爲什麼它不能被識別?謝謝你的方式。 – Enchanter 2015-02-06 00:44:58

+0

因爲'CBUFFER'是'PlayerClass'的一部分,所以你必須像在你的src文件中聲明'PlayerClass'函數一樣聲明它。 – 2015-02-06 00:46:43

回答

2

名稱CBUFFER屬於PLayerClass的範圍。有了這樣你

CBUFFER PlayerClass::constBuff() 
{ 
    return pUpdates; 
} 

名稱老式的C++ 03函數定義CBUFFER在封閉命名空間擡頭,並沒有發現。

您可以打資格賽,像

PlayerClass::CBUFFER PlayerClass::constBuff() 
{ 
    return pUpdates; 
} 

,或者是(IMO)聰明一點,並採取對所有的函數定義眼睛語法一個更容易,寫

auto PlayerClass::constBuff() 
    -> CBUFFER 
{ 
    return pUpdates; 
} 

其中,當遇到CBUFFER名稱時,編譯器知道它在成員函數定義中,因此也在類中查找該名稱。


在其他新聞中,類名稱前綴像CPlayer和像PlayerClass後綴不添加任何相關信息。他們只增加更多的寫作和更多的閱讀。那麼爲什麼不說名字Player。此外,ALL UPPERCASE是一個盲點,與宏的常見命名約定(以及常量的Java/Python約定)衝突。那麼爲什麼不打電話給或許更多的自我描述。

+0

你好 - 是的,謝謝你指出使用auto關鍵字,直到現在還不知道它的使用含義。也會記住這個班的命名習慣。 – Enchanter 2015-02-06 19:11:21