2009-12-13 36 views
23

Tôi không chắc chắn cách có hàm nhận đối tượng lớp làm tham số. Bất kỳ giúp đỡ? Đây là một ví dụ bên dưới.Cách sử dụng đối tượng lớp trong C++ làm tham số hàm

#include<iostream> 

void function(class object); //prototype 

void function(class tempObject) 
{ 
    //do something with object 
    //use or change member variables 
} 

Về cơ bản tôi chỉ là nhầm lẫn về cách tạo một hàm sẽ nhận một đối tượng lớp như các thông số của nó, và sau đó sử dụng những thông số bên trong hàm như tempObject.variable.

Xin lỗi nếu điều này gây nhầm lẫn, tôi tương đối mới với C++.

+0

@Adrian Vui lòng không phát minh ra thẻ mới - có quá nhiều thứ. –

Trả lời

29

class là từ khóa chỉ được sử dụng * để giới thiệu các định nghĩa lớp học. Khi bạn khai báo các cá thể lớp mới hoặc là các đối tượng cục bộ hoặc như các tham số hàm bạn chỉ sử dụng tên của lớp (mà phải nằm trong phạm vi) và không phải là từ khóa class chính nó.

ví dụ:

class ANewType 
{ 
    // ... details 
}; 

Định nghĩa loại mới này là ANewType là loại lớp.

Sau đó bạn có thể sử dụng trong khai báo hàm:

void function(ANewType object); 

Sau đó bạn có thể vượt qua các đối tượng của loại ANewType vào hàm. Đối tượng sẽ được sao chép vào tham số chức năng như vậy, giống như kiểu cơ bản, bất kỳ nỗ lực nào để sửa đổi thông số sẽ chỉ sửa đổi tham số trong hàm và sẽ không ảnh hưởng đến đối tượng ban đầu được chuyển.

Nếu bạn muốn sửa đổi đối tượng bên ngoài hàm như được chỉ ra bởi các chú thích trong phần thân hàm của bạn, bạn sẽ cần lấy đối tượng bằng tham chiếu (hoặc con trỏ). Ví dụ.

void function(ANewType& object); // object passed by reference 

Cú pháp này có nghĩa là bất kỳ sử dụng object trong cơ quan chức năng đề cập đến đối tượng thực tế đã được thông qua vào chức năng và không phải là một bản sao. Tất cả các sửa đổi sẽ sửa đổi đối tượng này và hiển thị khi chức năng đã hoàn thành.

[* Từ khóa class cũng được sử dụng trong định nghĩa mẫu, nhưng đó là một chủ đề khác.]

+3

Nó không giống như các từ khóa lớp là bất hợp pháp như ông sử dụng nó, mặc dù. Sau đây là một TU hoàn toàn hợp lệ: 'void f (class foo);'. Nếu "foo" chưa được biết, nó sẽ được giới thiệu ở đó, do đó, nó là một tuyên bố về phía trước ở một nơi không phổ biến. –

+1

@litb: chính xác 100% nhưng có thể gây nhầm lẫn hơn là hữu ích cho người mới bắt đầu. Tôi đã có một số kinh nghiệm với C + + nhưng tôi muốn được làm một đôi hoặc ba mất nếu tôi đi qua 'void f (class foo);' trong tự nhiên. –

+0

Hoàn hảo, cảm ơn lời giải thích mở rộng. Nhiều đánh giá cao! – James

8

Tại đơn giản nhất:

#include <iostream> 
using namespace std; 

class A { 
    public: 
    A(int x) : n(x){} 
    void print() { cout << n << endl; } 
    private: 
    int n; 
}; 

void func(A p) { 
    p.print(); 
} 

int main() { 
    A a; 
    func (a); 
} 

Tất nhiên, bạn có lẽ nên được sử dụng tài liệu tham khảo để vượt qua các đối tượng, nhưng tôi nghi ngờ bạn không có đối với họ nêu ra.

+2

Vượt qua bằng ref là một điều cần thiết cần thiết của C++ mà * cần * được giới thiệu ở phía trước, ngay cả khi người dùng chưa hiểu. Đặc biệt, OP muốn * sửa đổi * các thành viên lớp học. –

+1

Nếu anh ta không hiểu làm thế nào để thực hiện một cuộc gọi chức năng đơn giản, tôi nghĩ rằng giới thiệu tài liệu tham khảo là một ý tưởng tồi. Và nếu anh ta muốn thay đổi nội dung của lớp, anh ta cũng cần phải hiểu riêng tư và công khai và constness. –

+0

Bạn phải vượt qua một số giá trị khi bạn tạo một đối tượng như trong A a (4); trong dòng số 3 từ xuống, ví dụ. –

5

Nếu bạn muốn vượt qua lớp trường (đối tượng), bạn có thể sử dụng

void function(const MyClass& object){ 
    // do something with object 
} 

hoặc

void process(MyClass& object_to_be_changed){ 
    // change member variables 
} 

Mặt khác nếu bạn muốn "vượt qua" lớp chính nó

template<class AnyClass> 
void function_taking_class(){ 
    // use static functions of AnyClass 
    AnyClass::count_instances(); 
    // or create an object of AnyClass and use it 
    AnyClass object; 
    object.member = value; 
} 
// call it as 
function_taking_class<MyClass>(); 
// or 
function_taking_class<MyStruct>(); 

với

class MyClass{ 
    int member; 
    //... 
}; 
MyClass object1; 
+0

Một sự khác biệt tuyệt vời trên const, ở đó. –

-1

sai số nguyên tắc Lý do mã bên dưới là hiển thị cách không làm mất mọi chức năng chính và không nhập trở lại; cho chức năng ...... thay vì đẩy tất cả mọi thứ vào trầm tích mà là nguyên mẫu chức năng in ... nếu bạn cần phải sử dụng chức năng hữu ích ... bạn sẽ phải dưới đây ..... (ps này dưới đây dành cho những người bị choáng ngợp bởi những đối tượng và T mẫu đó cho phép các loại khai báo biến khác nhau (ví dụ như phao và char) để sử dụng cùng thông qua giá trị trong một sử dụng chức năng định nghĩa)

char arr[ ] = "This is a test"; 

string str(arr); 


// You can also assign directly to a string. 
str = "This is another string"; 

có thể bất cứ ai cho tôi biết tại sao C++ làm cho mảng được chuyển thành giá trị một tại một thời điểm và cách duy nhất để loại bỏ dấu cách và dấu chấm câu là sử dụng mã thông báo chuỗi. Tôi không thể giải quyết được vấn đề khi tôi đang cố xóa không gian cho một palindrome ...

#include <iostream> 
#include <iomanip> 
using namespace std; 
int getgrades(float[]); 
int getaverage(float[], float); 
int calculateletters(float[], float, float, float[]); 
int printResults(float[], float, float, float[]); 


int main() 
{ 

int i; 
float maxSize=3, size; 
float lettergrades[5], numericgrades[100], average; 

size=getgrades(numericgrades); 
average = getaverage(numericgrades, size); 
printResults(numericgrades, size, average, lettergrades); 
return 0; 
} 

int getgrades(float a[]) 
{ 


int i, max=3; 

for (i = 0; i <max; i++) 
{ 
    //ask use for input 
    cout << "\nPlease Enter grade " << i+1 << " : "; 
    cin >> a[i]; 
    //makes sure that user enters a vlue between 0 and 100 

    if(a[i] < 0 || a[i] >100) 
    { 
     cout << "Wrong input. Please 
enter a value between 0 and 100 only." << endl; 
     cout << "\nPlease Reenter grade " << i+1 << " : "; 
     cin >> a[i]; 

     return i; 
    } 
} 
} 

int getaverage(float a[], float n) 
{ 
int i; 
float sum = 0; 
if (n == 0) 
return 0; 
for (i = 0; i < n; i++) 
sum += a[i]; 
return sum/n; 
}        


int printResults(float a[], float n, float average, float letters[]) 
{ 
int i; 
cout << "Index Number | input | 
array values address in memory " << endl; 

for (i = 0; i < 3; i++) 
{ 
cout <<"  "<< i<<" \t\t"<<setprecision(3)<< 
a[i]<<"\t\t" << &a[i] << endl; 
} 
cout<<"The average of your grades is: "<<setprecision(3)<<average<<endl; 

} 
+0

Chào mừng bạn đến với Stack Overflow! Mặc dù mã này có thể giúp giải quyết vấn đề, nó không giải thích _why_ và/hoặc _how_ nó trả lời câu hỏi. Việc cung cấp ngữ cảnh bổ sung này sẽ cải thiện đáng kể giá trị giáo dục lâu dài của nó. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích, bao gồm những giới hạn và giả định được áp dụng. –

Các vấn đề liên quan