2015-04-03 81 views
0

我正在定義一個函數來向vector<Point> original_points添加元素,名爲
void add_point()。爲什麼強調original_points未定義,在函數體中,當我使用類型修飾符:朋友(以訪問),它是在類的範圍
班級範圍和私人成員?

// data structure representing Point in 2D plane 
class Point{ 
public: 
    //contructors 
    Point(); 
    Point(double x, double y); 
    // non-modifying methods 
    inline double get_xcoord()const{return xcoord;} 
    inline double get_ycoord()const{return ycoord;} 
    // modifying methods 
    inline double set_xcoord(double x){xcoord=x;} 
    inline double set_ycoord(double y){ycoord=y;} 
    // non-member function with access to private members 
    friend inline void add_point(const Point& p){original_points.push_back();} 
private: 
    double xcoord; 
    double ycoord; 
    vector<Point> original_points;}; 

我在做什麼錯?

+1

它應該是'p.original_points'。朋友功能不是會員功能。 – 0x499602D2 2015-04-03 13:56:42

+0

@ 0x499602D2'p.original_points.push_back'不起作用。 'p'是一個'const'引用。 – juanchopanza 2015-04-03 14:06:38

+1

'vector '在哪裏? – juanchopanza 2015-04-03 14:07:06

回答

1

朋友是一個非成員函數,所以它不能直接訪問非靜態成員;它需要一個Point對象來執行。您還需要傳遞一些信息給push_back

目前還不清楚函數參數p應該是訪問對象,對象是否傳遞到push_back或兩者;或者這是否應該成爲會員,而不是朋友。後者似乎更可能 - 您可能想要:

void add_point(const Point& p){original_points.push_back(p);} 
0

正如你所說的你想要添加點類型元素到保持字符串類型元素的向量,所以你也可能有類型不匹配錯誤。但對於未定義的,我有相同的錯誤,事實證明它是由字符串類型引起的,當你使用字符串時,應該提到你使用的是標準庫中的字符串,所以我添加了「using namespace std;」並且錯誤消失了。 它也可以幫助你。

+1

請問?不要推薦'使用名稱空間標準;',永遠不要! – 2015-04-03 13:59:16

+0

我沒有推薦,我說可能是什麼原因。 – Mamuka 2015-04-03 14:01:45

+0

_「我說可能是什麼原因。」_這不是原因。 – 2015-04-03 14:02:56

1

朋友確實可以訪問類的非公共部分。但這不是問題—函數仍然是非成員(如果它是一個成員,它不一定是朋友)。該功能需要對象來訪問該對象的非靜態成員。你所得到的是基本相同的:

class Point 
{ 
public: 
    vector<Point> original_points; 
}; 

void add_point(const Point &p) { original_points.push_back(p); } 

沒有original_pointsadd_point指。

無論你想original_pointsstatic,或者你有一個Point對象傳遞到add_point訪問其original_points成員,或訪問它p

作爲一個側面說明,push_back()需要一個參數—必須指定什麼添加到載體(但我認爲應該是p)。

3

有至少三大問題:

首先std::vector::push_back()有一個參數。您需要將一個Point實例傳遞給它。看來你要添加p

original_points.push_back(p); 

,友元函數是一個非成員,所以你不能訪問通過它的類的成員沒有該類的實例。你沒有這樣的例子,所以你的朋友功能沒有意義。這將編譯,但沒有任何作用:

friend 
inline void add_point(const Point& p){ 
    Point x; 
    x.original_points.push_back(p); 
} 

也許你想add_point()成爲會員,在這種情況下,它不應該是一個friend。這將解決第二個問題, ...

,假設original_pointsstd::vector<Point>,這種容器不能用一個不完全類型實例化。所以Point不能有一個數據成員std::vector<Point>沒有調用未定義的行爲。另一方面,如果是支持不完整類型的boost::container::<Point>或其他vector,那就沒問題。

總而言之,你的代碼看起來很破碎。

+0

'object_inst.original_points.push_back(object_inst);'是我想要避免的。看起來,如果我把'vector'形式的類與'add_point()'函數一起排除,會更好。 – Ziezi 2015-04-03 14:12:29

+0

@simplicisveritatis如果'original_points'是一個類的數據成員,則需要通過該類的一個對象訪問它,它不能獨立存在。無論如何,矢量不能是類的一部分(見上面的第三點)。 – juanchopanza 2015-04-03 14:19:20

+0

瞭解,謝謝! – Ziezi 2015-04-03 14:25:51

0

vector<Point>add_point(const Point& p)放在課堂背後的想法是確保某些地方。爲了把然後在共同namespace應該是一個更好的解決辦法(?)

namespace MyPoint{ 
// data structure representing Point in 2D plane 
class Point{ 
public: 
//contructors 
Point(); 
Point(double x, double y); 
// non-modifying methods 
inline double get_xcoord()const{return xcoord;} 
inline double get_ycoord()const{return ycoord;} 
// modifying methods 
inline double set_xcoord(double x){xcoord=x;} 
inline double set_ycoord(double y){ycoord=y;} 


private: 
double xcoord; 
double ycoord;}; 
vector<Point> original_points; 
void add_point(const Point& p){original_points.push_back(p);} //end of namespace