2014-10-30 62 views
1

我的Foo的一個結構:傳遞一個const指針...我需要這樣做嗎?

struct Foo 
{ 
}; 

我有酒吧的一個結構:

struct Bar 
{ 
}; 

它們由2層結構,其保持(添加/刪除),每個的一個指針數組處理:

struct FooContainer 
{ 
    Foo** FooList; 

    // add(), remove() etc 
}; 

struct BarContainer 
{ 
    Bar** BarList; 

    // add(), remove() etc 
}; 

現在,我要的是叫巴茲另一個結構可鏈接(在一到多的方式)向美孚巴茲。我不能(因爲這裏沒有解釋的原因)通過索引引用它們,它必須通過指針/引用。

事情是這樣的:

struct Baz 
{ 
    Foo* foo; 
    Bar* bar; 
}; 

如果我想添加一個構造函數來巴茲歷時這些非const指針,我會怎麼做呢?

Baz應該允許我改變它指向的Foo和Bar的哪個實例......所以它的指針不想是const。

我是否將指針作爲const傳遞給構造函數,然後對它們做些什麼,因爲如果我傳遞對struct的引用?然後,我試圖設置一個非const指針的值爲const指針的問題。

我希望這個問題是有道理的......

編輯:我應該使用引用,而不是指針?

回答

3

巴茲應該允許我改變Foo和Bar的哪個實例它指向...所以它的指針不想是const

這是正確的,你不想存儲常量指針。但是,它並不妨礙您存儲指向const的指針,這不是一回事。

這聽起來有點混亂,所以這裏使用Baz例如一個例證:

struct Baz 
{ 
    const Foo* foo; 
    const Bar* bar; 
    Baz(const Foo* newFoo, const Bar* newBar) : foo(newFoo), bar(newBar) {} 
    void setFoo(const Foo* newFoo) { foo = newFoo; } 
    void setBar(const Bar* newBar) { bar = newBar; } 
}; 

一切都將精編:這是FooBar通過foobarconst,而不是指針本身指向,這可以讓你隨心所欲地改變指針。

此,在另一方面,是不會編譯:

struct Baz 
{ // Note how const has moved to the other side of the asterisk 
    Foo* const foo; 
    Bar* const bar; 
    Baz(Foo* newFoo, Bar* newBar) : foo(newFoo), bar(newBar) {} 
    void setFoo(Foo* newFoo) { foo = newFoo; } // BROKEN!!! 
    void setBar(Bar* newBar) { bar = newBar; } // BROKEN!!! 
}; 

現在的指針,而不是「指針對象」,是const,阻止您更改foobar成員。

+0

這就是我的想法。爲什麼當你傳遞一個struct的引用時,你會將它作爲一個const引用傳遞給它? – Beakie 2014-10-30 17:07:05

+0

@Beakie如果你想改變你的'struct',你不必將它作爲'const'引用傳遞。當你不想改變它的時候,你把'const'放在調用你的函數時給調用者一個很大的靈活性,因爲通過'const'引用'struct'可以讓調用者通過一個臨時的。例如,如果你有'void foo(const Baz&b)',你可以這樣調用它:'foo(Baz(p1,p2))'。在這裏,'Baz'是一個臨時對象,但它可以,因爲'foo'通過'const'引用獲取'Baz'。沒有'const'這個相同的調用就不會編譯。 – dasblinkenlight 2014-10-30 17:10:45