2013-10-08 4 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 помощи заранее

UPDATE 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. Пожалуйста, прочитайте [контрольный список вопросов переполнения стека] (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 tutorial] (http://llvm.org/docs/tutorial/LangImpl3.html) таким же образом. Но я получаю ошибку. –

Смежные вопросы