2013-03-28 34 views
0
#ifndef SHAPEFACTORY_H_ 
#define SHAPEFACTORY_H_ 

#include <istream> 
#include <map> 
#include <string> 

#include "shape.h" 

typedef Shape *(createShapeFunction)(void); 
/* thrown when a shape cannot be read from a stream */ 
class WrongFormatException { }; 

class ShapeFactory { 

public: 

    static void registerFunction(const std::string &string, const createShapeFunction *shapeFunction); 
    static Shape *createShape(const std::string &string); 
    static Shape *createShape(std::istream &ins); 

private: 

    std::map<std::string, createShapeFunction *> creationFunctions; 
    ShapeFactory(); 
    static ShapeFactory *getShapeFactory(); 
}; 

#endif 

這頭,我還沒有實現任何方法,但我正在以下警告:預選賽功能型..有明確的行爲

Qualifier on function type 'createShapeFunction' (aka 'Shape *()') has unspecified behavior 

PS:這個頭球被給予我的老師和作爲功課我必須實施方法

+2

您需要在第一組parens中有一顆星:'typedef Shape *(* createShapeFunction)(void);' – metal

+0

就是這樣。謝謝! – Teodora

+0

@metal,請你解釋一下爲什麼? – Teodora

回答

3

這是一個愚蠢的警告消息。這不是沒有說明的,但的第二個參數const資格將被忽略。

讓我們看的createShapeFunctiontypedef

typedef Shape *(createShapeFunction)(void); 

你可以閱讀這種類型稱爲「不帶參數,並返回一個Shape*功能」。所以,那麼你有這種類型的參數:

const createShapeFunction* 

這將是一個指針const函數類型。不存在const函數類型,因此const將被忽略,參數類型等同於createShapeFunction*。即,指向上面定義的函數類型的指針。

這有可能是你的意思是爲createShapeFunction是一個函數指針類型本身:

typedef Shape *(*createShapeFunction)(void); 

現在你可以閱讀這種類型的「函數指針沒有參數和返回Shape*」。然後,這將使參數const createShapeFunction*指向const函數指針。

0

該警告被髮出,因爲類型const createShapeFunction*試圖創建一個const -qualified函數類型(因爲createShapeFunction被定義爲返回一個Shape*和不接受任何參數的函數的類型)。這是C++的標準11具有說些什麼(段落8.5.3/6):

的cv-限定符-SEQ的一個函數聲明的效果並不與加入CV - 功能類型頂部 的資格。在後一種情況下,cv限定符將被忽略。 [注意:具有 cv-qualifier-seq的函數類型不是cv限定類型;沒有cv限定的函數類型。末端注] [示例:

typedef void F(); 
struct S { 
    const F f; // OK: equivalent to: void f(); 
}; 

末端示例]

因此,編譯器警告你,你的意思是不是別的東西,而不是你真正寫的,因爲功能const資格類型將被忽略。