2016-12-02 9 views
0

私はもっと複雑なのproyectため、このサンドボックスコードを持って上書きすることなく、C++でのポインタの値を保存することができます方法:あなたはそれが

#include <sstream> 
#include <iostream> 
#include <vector> 

using namespace std; 

class Table 
{ 
    friend class Variable; 
public: 
    Variable * variables[1021]; 
}; 

class Variable 
{ 
    friend class Nodo; 
public: 
    char clas; 
    Nodo * ini; 
}; 

class Nodo 
{ 
public: 
    char clas; 
    Variable * father; 
private: 
    float * value; 
public: 
    Nodo(); 
    void set_value(float); 
    float * get_value(); 
}; 


Nodo::Nodo() 
{ 
    clas = ' '; 
    father = NULL; 
    value = NULL; 
} 

void Nodo::set_value(float m) 
{ 
    float * r = new float(); 
    r = &m; 
    value = (float *)r; 
} 

float * Nodo::get_value() 
{ 
    return this->value; 
} 

をそしてこれがメインです:

void main() 
{ 
    Nodo * n = new Nodo(); // OK. 
    n->set_value(5.3442);  // Ok. 

    Variable * v = new Variable();  // This is the problem. 

    // When I declare another pointer an initilized it, n lost the value stored in value. 

    Variable * v0 = new Variable(); // Here the same. 
    v->ini = n; 
    n->father = v; 

    Table * t = new Table(); 
    t->variables[0] = v; 

    v0 = t->variables[0]; 

    cout << *(static_cast<float *>(v0->ini->get_value())) << endl; 
} 

どのように私は変更なしでポインタの値を在庫できますか?私はconstなどを使うべきだと思われますが、私はどのようにしているのか分かりません。フィールド値をプライベートとして宣言することは役に立ちません。アイデアは、後でボイド*と置き換えて、基本データの任意のキングを格納するだけでなく、データを浮動させることです。

ありがとうございます!

+0

申し訳ありませんが、あなたの問題が何であるかはわかりません。 'Variable * v = new Variable();で何が問題になっていますか? '? – NathanOliver

+0

'void main()'は間違っていて、私はそのポインタビジネスの理由を見ることができません。良いC++の本を読むべきです。 –

+1

C++はJavaではありません。あなたはそれらの新しいものすべてを必要としません。 –

答えて

1

これは間違っているになります。

void Nodo::set_value(float m) 
{ 
    float * r = new float(); 
    r = &m; 
    value = (float *)r; 
} 

r

は一時的なもので mへのポインタを割り当てられ、このポインタは set_value終了すると無効になります。また、r値を上書きするので、ここに漏れがあります。正しいバージョンは、

void Nodo::set_value(float m) 
{ 
    float * r = new float(); 
    *r = m; 
    value = r; 
} 

btwです。私はあなたのコードで深く掘り下げていません...

+0

ありがとうmarcinj!正常に動作します!改善や学習のための提案はありますか? – greatfullgigapower

+0

@greatfullgigapowerなぜ単に '浮動小数点型 'を持つのではなく、' value'を浮動小数点へのポインタにしますか? ( 'new'を使って)メモリを割り当てるときには、(deleteを使って)メモリを解放することを忘れないでください。メモリを解放する唯一の安全な方法は、RAIIイディオムを、例えば 'unique_ptr'のようなスマートポインタの形で使うことです。しかし、あなたがポインタを必要としないときは、それを使わないでください。私は自分の生産コードで 'new'または' delete'を最後に使用しなければならない時はいつか思い出しません。 – marcinj

+0

当初はvoid *でしたが、正しいことをstatic_cast ...と表示するにはfloat *でコードをデバッグする際に保存された値を見ることができます。目的は私がvoid *でfloat *を変更することです。私はコードが目の痛みかもしれないが、私は専門家ではないことを知っている。趣味のためだけです:) – greatfullgigapower

関連する問題