2013-10-08 49 views
-3

我將子對象解析爲方法,但我的子數據丟失。請告訴如何在不丟失數據的情況下解析對象。如何在方法中傳遞子對象

class A 
{ 
    int size;  
    std::string name; 
public:  
    A(const std::string &name, int &size){}  
    virtual B *C(); 
} 

function D() 
{ 
    int size = 10; 
    std::string name = "name"; 
    return new A(name , size); 
} 
B *A::C(){ 
    \\here I need name and size 
} 

寫信跟大小給它的值是0,而不是10和名字給它分段故障

感謝4的幫助下提前

更新1 我的代碼抽象

class PrototypeAST 
{ 
int size; 
std::string FnName; 
std::vector<std::string> ArgNames; 
public: 
PrototypeAST(const std::string &fnName, const std::vector<std::string> &argNames, int &size) 
: FnName(fnName), ArgNames(argNames) {} 
Function *Codegen(); 
void CreateArgumentAllocas(Function *F); 
}; 

static PrototypeAST *ParsePrototype() { 
    int size; 
    std::string FnName = IdentifierStr; 
    getNextToken();//eat id1 
    std::vector<std::string> ArgNames; 
    if(CurTok != ')') 
    { 
getNextToken(); //eat int 
    ArgNames.push_back(IdentifierStr); 
    getNextToken();// eat id 
    while (CurTok == ',') 
    { 
     getNextToken(); //eat , 
     getNextToken(); //eat int 
     ArgNames.push_back(IdentifierStr); 
     getNextToken();// eat id 

    } 
    } 

    // success. 
getNextToken(); // eat ')'. 
size = ArgNames.size(); 
return new PrototypeAST(FnName, ArgNames, size); 
} 

Function *PrototypeAST::Codegen() { 

    printf("\nI am in prototypeAST function\n"); 

    // Make the function type: double(double,double) etc. 
    std::vector<Type*> Doubles(size, 
         Type::getInt1Ty(getGlobalContext())); 
printf("\nI am in prototypeAST function's 1\n"); 
FunctionType *FT; 
if(isFunInt) 
    FT = FunctionType::get(Type::getInt1Ty(getGlobalContext()), 
            Doubles, false); 
    else if(isFunVoid) 
    FT = FunctionType::get(Type::getInt1Ty(getGlobalContext()), 
            Doubles, false); 
      printf("\nI am in prototypeAST function's 2\n"); 

Function *F = Function::Create(FT, Function::ExternalLinkage, FnName, TheModule); 
printf("\nI am in prototypeAST function's 3\n"); 
// If F conflicted, there was already something named 'Name'. If it has a 
// body, don't allow redefinition or reextern. 
if (F->getName() != FnName) { 
    // Delete the one we just made and get the existing one. 
    F->eraseFromParent(); 
    F = TheModule->getFunction(FnName); 
    } 
// Set names for all arguments. 
unsigned Idx = 0; 
for (Function::arg_iterator AI = F->arg_begin(); Idx != ArgNames.size(); 
    ++AI, ++Idx) { 
    AI->setName(ArgNames[Idx]); 
} 
printf("\nI am in prototypeAST function\n"); 
return F; 
} 
+4

你能發佈一些更接近真正的C++代碼嗎? – juanchopanza

+0

你好,歡迎來到stackoverflow.com。請閱讀[Stack Overflow問題清單](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。您可能還想了解[SSCCE](http://sscce.org/)是什麼。 –

+0

如果你真的有一個空構造函數,我建議你開始在那裏尋找問題。請記住,給同一個名字不會使它們成爲同一個事物。 – molbdnilo

回答

0

我有你想做的事情。這是做到這一點的方法。

空構造函數正在造成問題。您可以按照以下方式使用函數返回的值初始化參數。

class A 
{ 
    int Size;  
    std::string Name; 
public:  
    A(const std::string &name, int &size):Name(name), Size(size) {}  
    virtual B *C(); 
} 

A *D() 
{ 
    int size = 10; 
    std::string name = "name"; 
    return new A(name , size); 
} 
B *A::C(){ 
    \\here I need name and size 
} 
1

正如其他人在評論中指出的,你應該看看空的構造函數。您沒有在構造函數中設置數據成員的值。這就是錯誤的原因。 PS:熟悉堆棧溢出問題清單。快樂學習。

+0

的一部分這裏是一個更多的問題什麼'函數D()'這實際上是'函數A * D()'將返回將不會反映在我的構造函數類..? –

+0

我試圖做的事情在[llvm教程](http://llvm.org/docs/tutorial/LangImpl3.html)上也是這樣做的。但我得到的錯誤。 –