01/10/2018, 12:35

Friend function trong C++

Không nhận được hàm friend trong hàm main code:
Maytinh.hpp

friend void Nhapmaytinh(Maytinh* mt);
friend void Xuatmaytinh(Maytinh* mt);

Maytinh.cpp

void Nhapmaytinh(Maytinh* mt)
{
 for(int i = 0; i < sizeof(mt); ++i)
 {
  mt[i].Input();
 }
}

void Xuatmaytinh(Maytinh* mt)
{
 for(int i = 0; i < sizeof(mt); ++i)
 {
  mt[i].Output();
 }
}

main.cpp

 Maytinh mt[1];
 Nhapmaytinh(mt);
 Xuatmaytinh(mt);

Build code bằng makefile thì file Maytinh.o thì bình thường nhưng main.o thì thông báo không thể tham chiếu tới 2 hàm friend. Mong mọi người hướng dẫn.

Dark.Hades viết 14:50 ngày 01/10/2018

Bạn đang làm gì?
friend nó có nghĩa là giúp truy cập những gì mà class đó được đặt private/protected.
Bạn chỉ đưa có 2 dòng code kia thì ai mà giải thích nổi.

1 lần nữa mình khuyên bạn nên học bài bản, đừng nhảy vọt. C/C++ nó dễ sử dụng nhưng để sử dụng tốt thì phải học chắc cái nền trước đã.
http://learncpp.com <= vào đây đề học lại từ đầu cho kỹ.

nghia viết 14:40 ngày 01/10/2018

Thực ra em rành về C rồi em học c++ cơ bản rồi nhưng đang tự học oop. Em đã từng học c# oop do trường day. Em hiểu về oop. friend có 2 loại hàm và class. Nếu là class thì có thể truy vấn các phần tử private + protected. Hàm thì thông báo hàm đó không thuộc class nào và có thể truy cập private + protected.

nghia viết 14:48 ngày 01/10/2018

code 3 file cua em.

Maytinh.hpp
-----------------------------------------
#ifndef __MAYTINH_HPP__
#define __MAYTINH_HPP__

#include"iostream"
#include"May.hpp"

using namespace std;
namespace bai2_1{
 class Maytinh: public May{
  private:
   int tocdo;
   int ram;
   int hdd;
  public:
   Maytinh();
   ~Maytinh(){};
   void Input(void);
   void Output(void);
   friend void Nhapmaytinh(Maytinh* mt);
   friend void Xuatmaytinh(Maytinh* mt);
 };
}

#endif
---------------------------------------------------------------------
Maytinh.cpp
--------------------------------------------------------------------

#include"Maytinh.hpp"

using namespace bai2_1;

Maytinh::Maytinh():May()
{
 tocdo = 0;
 ram = 0;
 hdd =0;
}

void Maytinh::Input(void)
{
 May::Input();
 cout<<"Nhap toc do: ";
 cin>>this->tocdo;
 cout<<"Nhap dung luong ram: ";
 cin>>this->ram;
 cout<<"Nhap dung luong hdd: ";
 cin>>this->hdd;
}

void Maytinh::Output(void)
{
 May::Output();
 cout<<"Toc do: "<<this->tocdo<<endl;
 cout<<"Dung luong ram: "<<this->ram<<endl;
 cout<<"Dung luong hdd: "<<this->hdd<<endl;
}

void Nhapmaytinh(Maytinh* mt)
{
 for(int i = 0; i < sizeof(mt); ++i)
 {
  mt[i].Input();
 }
}

void Xuatmaytinh(Maytinh* mt)
{
 for(int i = 0; i < sizeof(mt); ++i)
 {
  mt[i].Output();
 }
}
------------------------------------------------
main.cpp
-------------------------------------------------
#include"Maytinh.hpp"

using namespace bai2_1;
int main()
{
 Maytinh mt[1];
 Nhapmaytinh(mt);
 Xuatmaytinh(mt);
}
--------------------------------------
makefile 
--------------------------------------
object = main.o May.o Maytinh.o

May.o: May.hpp Nhasx.hpp May.cpp
	g++ -c May.cpp
Maytinh.o: Maytinh.hpp Maytinh.cpp
	g++ -c Maytinh.cpp
main.o: main.cpp
	g++ -c main.cpp
main: $(object)
	g++ $(object) -o main

.PHONY: $(object) main
Dark.Hades viết 14:49 ngày 01/10/2018

friend có 2 loại hàm và class

Câu này là sao?

Nếu là class thì có thể truy vấn các phần tử private + protected. Hàm thì thông báo hàm đó không thuộc class nào và có thể truy cập private + protected.

Còn cái đoạn này nữa @@

Mình khuyên bạn cứ học C++, C++ OOP là đảm bảo ôm được hết đống C, C#, Java,… ở mức căn bản, đủ để deal app.
Và học C++ thì hãy quên hết mấy thằng kia đi, chỉ cần chú ý học nó thôi. lên learncpp.com như mình đã nói rồi đọc khoảng 1 nửa và thực hành theo là dư sức rồi.

nghia viết 14:40 ngày 01/10/2018

Friend:em đọc tới bây giờ thì em biết 2 cái: function friend và class friend
friend class: thì ai là bạn có thể truy xuất private và protected của lớp đó.
friend function: thì khi khai báo thì hàm đó sẽ không thuộc về class nào(class chứa khai báo). khi tạo đối tượng chứa hàm friend trong hàm thì nó có thể truy xuất vào các private và protected của class chứa nó.
Nếu em viết sai thì mong anh có thể chỉ dạy thêm. Em cảm ơn anh!

–>Ý định em viết ra không có ý gì hết em chỉ nói cái gì em biết thôi có gì mong anh tha lỗi.

Dark.Hades viết 14:45 ngày 01/10/2018

void Nhapmaytinh(Maytinh* mt)
{
for(int i = 0; i < sizeof(mt); ++i)
{
mt[i].Input();
}
}

void Xuatmaytinh(Maytinh* mt)
{
for(int i = 0; i < sizeof(mt); ++i)
{
mt[i].Output();
}
}

Bạn không khai báo namespace cho 2 hàm này thì nó bị lỗi undefined là đúng rồi.
Và ở chỗ này:

using namespace bai2_1;

đừng sử dụng using namespace thế này, bạn sẽ không biết rằng bạn đang khai báo cái gì cho thằng nào đâu, đừng nên theo C# hay Java ở khoản này, khai báo rõ ràng ra như sau:

namespace bai2_1
{
  void Maytinh::XXXXXX
   .....
  void void Xuatmaytinh(Maytinh* mt)
   .....
}

Nó sẽ bó gọn vào trong scope đó, đến lúc đọc code bạn cũng biết được là hàm nào thuộc scope nào

// Header viết thế nào thì xuống dưới source viết y hệt như vậy.

nghia viết 14:39 ngày 01/10/2018

Em cảm ơn anh nhiều nếu em có gì sai thì mong anh tha lỗi!

Dark.Hades viết 14:45 ngày 01/10/2018

Cứ thoải mái đi bạn, có gì đâu mà lỗi với lầm. Giọng văn của mình nó nghe khó lọt tai nên giống như đang chửi nhau thôi, đừng để bụng

Bài liên quan
0