我知道下面的代碼有效。
int* pn;
pn = new int;
所以我嘗試在我的自定義類中以同樣的方式應用它。
class Matrix {
private:
typedef struct ex_node* ex_pointer;
typedef struct ex_node {
int ex_data;
ex_pointer next;
};
public:
void examplefunction() {
ex_pointer node;
node = new ex_node; //error here
}
};
該錯誤表明我無法將“ex_node*”型別值分配給“ex_pointer”型別物體。
但是 ex_pointer 被定義為 ex_node*。
ex_pointer 與 ex_node* 的型別不同嗎?如何消除此錯誤?
uj5u.com熱心網友回復:
我喜歡這個問題,而且 Jason Liam 已經提供了不同的方法來修復您的代碼。但我想回答你的第一個問題,這些問題是完全有效的:“錯誤表明我不能將“ex_node ”型別值分配給“ex_pointer”型別物體。但是 ex_pointer 被定義為 ex_node*。ex_pointer 與 ex_node 的型別不同嗎*?”
讓我們檢查一下編譯器是怎么說的:
error: incompatible pointer types assigning to 'Matrix::ex_pointer' (aka 'ex_node *')
from 'Matrix::ex_node *'
node = new ex_node;
^~~~~~~~~~~
所以,問題在于 node 的型別是Matrix::ex_pointer,即 a ex_node *。 new ex_node而不是 type Matrix::ex_node *。前者是一個struct ex_node在全域命名空間中定義的指標,而后者是一個struct ex_node在內部定義的指標class Matrix。
顯然,在 typedef中向前宣告一個結構假定該結構位于全域命名空間中,在您的情況下這是不正確的。您可以通過在 typedef 之前宣告您的結構來修復它(也由 Jason Liam 建議):
class Matrix {
struct ex_node;
typedef struct ex_node* ex_pointer;
struct ex_node {
int ex_data;
ex_pointer next;
};
public:
void examplefunction() {
ex_pointer node;
node = new ex_node;
}
};
最后:不要將該指標隱藏在 typedef 后面。
uj5u.com熱心網友回復:
執行此操作的更多 C 方式(和正確方式)是洗掉不必要typedef的 s,如下所示:
class Matrix {
private:
struct ex_node {
int ex_data;
//------vvvvvvvv---------->directly using ex_node* is more clear IMO
ex_node* next;
};
using ex_pointer = ex_node*;
public:
void examplefunction(){
//------vvvvvvvvvv---------->you can use ex_pointer if you really want
ex_pointer node;
node = new ex_node;; //works now
}
};
演示
方法二
如果您愿意,您仍然可以使用別名,如下所示。在這里,我們為inside提供了一個前向宣告,以便我們可以使用 typedef/using 。ex_nodeMatrix
class Matrix {
private:
struct ex_node; //forward declaration
using ex_pointer = ex_node*;
struct ex_node {
int ex_data;
//------vvvvvvvvv---------->use ex_pointer
ex_pointer next;
};
public:
void examplefunction(){
ex_pointer node;
node = new ex_node;;
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532303.html
標籤:C 指针
上一篇:不使用遞回復制鏈表
