2015-07-27 4 views
0

Я беру курс C++, и я застрял на классах и объектах. Я работаю над заданием, которое в двух словах создает класс, который принимает две переменные (скажем, длину и ширину).Прохождение объектов класса в C++

Я понял, как это сделать, используя функции get и set. Но тогда мы должны использовать математику для этих переменных. Мы должны написать функцию, которая принимает один экземпляр класса в качестве параметра (так что две переменные), а затем выполняет математику как для этого объекта (тот, который принимается как параметр), и для объекта, который вызвал метод.

Часть, почему я смущен, это язык, и я не уверен, что это значит. До сих пор, как я уже сказал, мне удалось в итоге получить переменные setLength и setWidth, заданные с помощью пользовательского ввода. Я действительно, действительно застрял, пытаясь затем передать эти значения (или этот объект?) В функцию, а затем вызвать метод другого объекта?

Может быть, если кто-то может помочь мне понять, что «взять объект в качестве параметра, а затем сделать математику на объекте, который я назвал методом« означает »? Или просто помочь с прохождением объектов?

+0

Например, подумайте о 'string' (или' std :: string'). Я могу сказать 'string myString =" test ";' и установить строку для "test". Что это значит? Строка - это объект, созданный (или созданный экземпляр) из класса. Он содержит указатель на массив символов внутри (предположительно) и определяет функции для взаимодействия с другими строками. Например, я могу сказать 'myString.compare (anotherString)', и он возьмет другой объект строкового класса и сравним себя с этой строкой и вернет 'int'. – RyanP

+5

_ «Я полагаю, что если я смогу участвовать в диалоге и задавать вопросы, это поможет мне понять!» _ Тогда вы не ищете репозиторий Q & A, а чат. К счастью, у нас есть некоторые из них здесь ... –

ответ

4

Передача объекта работает так же, как передача других видов переменных. Если вы проходили целое число в функцию, вы будете использовать этот синтаксис для объявления функции:

void myFunction(int myInt); 

и если вы проходили в объекте класса Foo, было бы:

void myOtherFunction(Foo myFoo); 

Это вроде как говорят, «Это вещь, которую я хочу использовать в вычислениях Скопируйте объект я прохожу здесь !. Переходя по ссылке, а:.

void myFunction(int &myInt); 
void myOtherFunction(Foo &myFoo); 

позволяет изменять значение, которое вы передаете. Это также значительно дешевле с более крупными объектами, чем , проходя мимо значения, который был исходным синтаксисом в этом ответе. Вы можете думать об этом, как вы говорите компьютеру: «Я знаю, что вы хотите это значение, но я не позволю вам его копировать. Просто посмотрите , а вы найдете то, что я хочу, чтобы вы работать с." Но иногда вы не хотите изменять то, с чем работаете!

Несомненно, вы можете быть очень осторожным в своей функции, чтобы избежать изменения, но язык C++ позволяет вам сказать, что вы не должны изменять эту переменную, а затем убедитесь, что вы не изменяете ее для себя !

Это может быть достигнуто с помощью

void yetAnotherFunction(const Foo &myFoo); 

const что говорит «Не дай мне быть изменен!» компилятору, и компилятор будет слушать.


Допустим, вы хотите присвоить несколько значений простого объекта, используя (нечленом) функция:

// a struct should usually hold simple groups of data, 
// that don't do much by themselves. Their members are 
// also public by default. 
struct MySimpleType{ 
    int first; 
    int second; 
}; 

// object is passed by reference so it can be modified. 
void modifier(MySimpleType &object, int newFirst, int newSecond){ 
    object.first = newFirst; 
    object.second = newSecond; 
} 

затем в коде клиента (возможно main функции в этой точке в вашей карьере кодирования) вы это делаете:

MySimpleType object; 

modifier(object, 13, 12); 

cout << object.first << ", " << object.second; 

, который должен распечатать:

13, 12 
+0

Если ваш объект большой, и вы не хотите его менять, перейдите по ссылке 'const':' void myOtherFunction (const Foo & myFoo); '. – user877329

+0

спасибо. поэтому, если я просто создаю объект класса и пытаюсь передать его функции, ничего не происходит, потому что просто создавая объект, вы не обязательно назначаете какие-либо параметры, верно? Поэтому в моем случае я беру пользовательский ввод. Я не могу понять, как «назначить» этот пользовательский ввод объекту. Поэтому в приведенном выше примере у меня есть переменные setLength, взятые из пользовательского ввода. Я не могу понять, как назначить эти переменные новому объекту, чтобы затем объект проходил, вместе с ним передается ввод пользователя (в виде переменных)! благодаря! – FKAjasmine

+0

@ user877329 изменен, чтобы включить объяснение 'const'. Спасибо, что я пропустил это. – jaggedSpire

1

Как из Вашего комментария:

"Я не могу показаться, чтобы выяснить, как„назначить“этот пользовательский ввод к объекту. Поэтому в приведенном выше примере у меня есть переменные setLength, взятые из пользовательского ввода. Я не могу понять, как присвоить эти переменные для нового объекта, так что то объект проходит, пользовательский ввод (в виде переменных) передается вместе с ним!»

То, что я думаю, что вы на самом деле нужно есть некоторая функция (s), чтобы манипулировать переменные-члены класса путем чтения из std::istream, и передавая экземпляр объекта целенаправленный в качестве ссылки:

class foo { 
public: 
    foo() : x(12), y(42.0) {} 
private: 
    friend std::istream& operator>>(std::istream& is, foo& subject); 
    std::istream& getfrominstream (std::istream& is) { 
     is >> x; 
     is >> y; 
     return is; 
    } 
    int x; 
    double y; 
}; 

std::istream& operator>>(std::istream& is, foo& subject) { 
    return subject.getfrominstream(is); 
} 

вызова, как:

int main() { 
    foo f; 
    std::cin >> f; 
} 
2

Думая о фрагментах кода как «объектов», может быть сложно сначала, но это, вероятно, будет одной из самых важных вещей, которые вы узнаете (поскольку объектно-ориентированное программирование широко используется в промышленности и науке). Для эффективного использования объектов на C++ достаточно много фона, но я попытаюсь дать краткое введение.

Во-первых, важно понимать разницу между «классом» и «классом», объект «. Класс - это абстракция, которая позволяет вам определить объект. Если я хочу создать объект Horse, я использую класс Horse, чтобы определить, что важно для лошади. Этот класс может иметь поля, определяющие его имя, владельца, цвет волос и т. Д. Однако класс Horse не является лошадью. Он говорит вам, что значит быть Horse, но это не одно. Для того, чтобы определить «объект» типа Horse, мы должны написать следующее:

Horse myHorse = new Horse("Sea Biscuit", "Howard", "Black"); 

Имейте в виду, что Horse класс, но сухарь является сама лошадь (объект).

Возможно, вы хорошо знаете вышеизложенное, но часто это может быть сложное понятие, чтобы понять, поэтому я подумал, что хочу упомянуть об этом.

Теперь, если вы хотите выполнить математику на некоторых объектах, это относительно просто с использованием функций-членов. Давайте определим новый класс, чтобы выполнить некоторую математику (потому что лошади и математика не смешиваются).

class Wallet 
{ 
    int _pennies; 

    // This is a constructor. It allows us to write: Wallet myWallet(100); 
    public Wallet(int pennies) 
    { 
     _pennies = pennies; 
    } 

    public void addPennies(int pennies) 
    { 
     _pennies = _pennies + pennies; 
    } 

    public void stealPennies(Wallet &stolenWallet) 
    { 
     int stolenPennies = stolenWallet._pennies; 
     stolenWallet._pennies = 0; 

     this.addPennies(stolenPennies); 
    } 
} 

Теперь мы можем сделать некоторые объекты и изменять поля в обоих объектах с одним вызовом stealPennies:

int main() 
{ 
    Wallet myWallet(10); // Creates a wallet with 10 cents. 
    Wallet anotherWallet(50); // Creates another wallet with 50 cents. 

    myWallet.stealPennies(anotherWallet); 
    // myWallet now has 60 cents, and anotherWallet has none. 
} 

Примечание:& перед именем аргумента в stealPennies функция означает, что он будет принят ссылка. Обычно, когда вы передаете аргумент функции, он передается значением, что означает, что переменная в функции является копией аргумента, который вы передали. Помещение & перед именем аргумента означает, что переменная в функции является той же переменной вместо копии. (Это очень упрощено. Маловероятно, что вы сможете полностью понять, проходя по ссылке, пока не познакомитесь с указателями). Кроме того, общепринятой практикой является использование какого-либо соглашения об именах при определении переменных, которые являются частью класса. Помещение подчеркивания перед именем переменной является общим (например, _pennies в этом примере).

Надеюсь, это полезно для вас (и, надеюсь, оно работает, поскольку я не могу проверить его в данный момент). Я попытался сделать код максимально читабельным и явным.

+0

Считает очень смущенным и несвязанным. –

Смежные вопросы