01/10/2018, 10:19

Vấn đề về trả về con trỏ trong hàm static trong C++

Chào mọi người!

Em đang có vấn đề là làm sao khi tạo lập một đối tượng trong hàm rồi trả về property là con trỏ của đối tượng, để giải thích cho vấn đề thì có example như sau.

class String {
private:
	char* original;

public:
	/**
	 * String constructor
	 */
	String(char *target) {
		int length = strlen(target);
		this->original = new char[length + 1];

		int index;
		for(index = 0; index < length; ++index) {
			this->original[index] = target[index];
		}
		this->original[length] = '';
	}

	/**
	 * String destructor
	 */
	~String() {
		delete this->original;
	}

	/**
	 * Menthod toStirng
	 * 
	 * @return char*
	 */
	char *toString() const {
		return this->original;
	}

	/**
	 * Static method toString
	 * 
	 * @param  target char*
	 * @return char *
	 */
	static char *toString(char *target) {
		String result = target;
		return result.toString();
	}
};

int main() {
	/* code */
	char *pointer = String::toString((char*) "Ahihi");
	cout << pointer << endl;
	return 0;
}

Trong hàm static toString khi tạo lập đối tượng String rồi return result.toString() thì sẽ không trả về pointer original được vì cái result đã bị out scope nên bị xóa mất cái original. Đây là hình ảnh khi chay đoạn code trên.

Nó sẽ không in ra gì cả vì pointer đã bị delete. Em biết là chúng ta có thể cấp phát một con trỏ char* trong hàm này rồi copy data qua rồi trả về, nhưng dùng cách này thì ta phải delete cái pointer đó ngoài hàm main. Nhưng em không muốn như vậy, có cách nào có thể không cấp phát trong hàm static mà vẩn trả vê được được không ạ?
Đây là example nên mọi người đừng xét nét cú pháp logic nó quá nhé.

Em xin cảm ơn

viết 12:25 ngày 01/10/2018

bản thân con trỏ truyền vào là char* rồi cần trả về char* nữa làm gì vậy??

static char *toString(char *target)
{
    return target; //ngon lành cành đào????
}

delete mảng mà con trỏ trỏ thì phải xài delete[], delete ko là ko đủ.

Anh Khoa Nguyen viết 12:31 ngày 01/10/2018
Đây là example nên mọi người đừng xét nét cú pháp logic nó quá nhé.

Em chỉ viết ở đây là example thôi, ý em hỏi là làm sao trả về giá trị của pointer mà không cần cấp phát

viết 12:30 ngày 01/10/2018

Em chỉ viết ở đây là example thôi, ý em hỏi là làm sao trả về giá trị của pointer mà không cần cấp phát

return target;

trả về thẳng nó luôn, ko cần cấp phát.

hỏi hại não quá

Khoa NTA viết 12:25 ngày 01/10/2018
  1. Ví dụ của bạn hơi cùi chuối thử hàm static toString nhận input là 1 số xem.
  2. Mình nghĩ là mình hiểu: bạn muốn dùng method của class String vào hàm static đó.
    How about:
static char *toString(char *target) {
	static String result = target;
	return result.toString();
}

Mình thấy nó output đúng là “Ahihi” và destructor được gọi sau khi kết thúc hàm main :v (chèn thêm vài dòng code trong destructor là thấy mà).

P/s: mình chuyên kiểu thủ tục, không rành OOP, sai thì bỏ qua, mình cảm ơn

Anh Khoa Nguyen viết 12:35 ngày 01/10/2018

Đúng là hơi chuối thật =)). Để mình test thử

Anh Khoa Nguyen viết 12:32 ngày 01/10/2018

Oke được rồi bạn.
Thank bạn nhé!!!

Bài liên quan
0