як працює оператор dereference?

Я є програмістом Java, який намагається навчити себе C ++. Будь ласка, скороти мені слабку, якщо спочатку запитую прості запитання.

Я хотів би зрозуміти, як працює оператор dereference структури. Зокрема, чи може хто-небудь сказати мені, що таке рядок коду робиться в явних умовах?

    if (elements[i]->test(arga, argb)) {}

тест (arga, argb) - це логічна функція в одному класі, а елементи - вектор екземплярів класу елементів. Ось код, який безпосередньо оточує лінію вище, про яку я зацікавлений:

for (unsigned i = 0; i < elements.size(); ++i) {
    T arga = INFINITY, argb = INFINITY;
    //using namespace std;
    //std::cout >> elements[i] >> std::endl;
    //std::cout >> test(arga, argb) >> std::endl;
    if (elements[i]->test(arga, argb)) {
        //some code
    }
}

Схоже, що тест if line перевіряє, чи повертається логічним значенням тест (arga, argb) є частиною даного екземпляра класу елементів. Але коли я намагаюся виставити основні значення елементів [i] або тестування (arga, argb) з лініями cout вище, компілятор викидає помилки, поки я не коментую ці рядки. У Java, я зможу розібратися з цим, поки не знайду значення кожного, що відповідає один одному, і тоді я б зрозумів рядок коду. Але я не знаю, як з'ясувати, що це рядок коду робить у C ++. Чи може хто-небудь дати мені чітке пояснення, бажано підтримується посиланням або два з деякими посиланнями в Інтернеті?

0
Дякую всім за вашу допомогу. Я буду входити і дослідити це пізніше, коли маю час глибоко досліджувати і розглянути те, що це таке, що ви кажете кожен. А тим часом +1 усім, хто намагався допомогти.
додано Автор CodeMed, джерело
@AndreyT Я буду копати в цьому глибше в понеділок, щоб я міг забезпечити більш змістовну взаємодію. Це були довгі вихідні.
додано Автор CodeMed, джерело
@AndreyT Я буду копати в цьому глибше в понеділок, щоб я міг забезпечити більш змістовну взаємодію. Це були довгі вихідні.
додано Автор CodeMed, джерело
@AndreyT Я буду копати в цьому глибше в понеділок, щоб я міг забезпечити більш змістовну взаємодію. Це були довгі вихідні.
додано Автор CodeMed, джерело
Не могли б ви показати декларацію елементів ?
додано Автор juanchopanza, джерело
@syam правильно, але в C ++ ви також можете визначити оператори відхилення для певних типів користувачів. Отже, щоб зрозуміти, що ви насправді запитуєте, потрібно знати, що таке elememts , і який тип він містить, якщо він містить щось інше, ніж покажчики.
додано Автор juanchopanza, джерело
@CodeMed: Знову ж таки, де є декларація elements ? У C ++ немає сенсу відповісти на ваше запитання, не знаючи, що таке elements .
додано Автор AnT, джерело
Щоб допомогти вам зрозуміти: у C ++ ми розрізняємо -> і . , оскільки вони не працюють на одних і тих же об'єктах (покажчик проти простого об'єкта та/або посилання). Але для того, щоб пов'язувати вас із вашим Java-досвідом, переважно перекладіть -> на . тобто. elements [i] .test (arga, argb) . Але майте на увазі, що C ++ робить різницю між значенням та довідковою базою, тоді як в Java практично все є посиланням.
додано Автор syam, джерело

9 Відповіді

elements[i]->test (arga, argb)

Якщо ми розібрати твердження, читаючи з зліва направо , ми опинимося нижче:

  1. access the ith element in an array (or array-like) entity named elements

  2. the element accessed (elements[i]) is a pointer to an object

  3. call the member-function named test on elements[i] and pass it two arguments; arga and argb

if we disregard the fact that you wrote std::cout >> instead of std::cout << (the latter is the correct form), we end up with two reasons for your described errors:

  1. your compiler complains about std::cout << element[i] because no suitable overload is found to handle an entity of the type of element[i] and an std::ostream& (which is the underlying type of std::cout).

  2. your compiler complains about std::cout << test (arga, argb) because there is no function in scope named test that takes two arguments corresponding to arga, argv. test, in your snippet, is a member-function that belongs to an entity, it's not callable by its own.

3
додано
elements[i]->test (arga, argb)

Якщо ми розібрати твердження, читаючи з зліва направо , ми опинимося нижче:

  1. access the ith element in an array (or array-like) entity named elements

  2. the element accessed (elements[i]) is a pointer to an object

  3. call the member-function named test on elements[i] and pass it two arguments; arga and argb

if we disregard the fact that you wrote std::cout >> instead of std::cout << (the latter is the correct form), we end up with two reasons for your described errors:

  1. your compiler complains about std::cout << element[i] because no suitable overload is found to handle an entity of the type of element[i] and an std::ostream& (which is the underlying type of std::cout).

  2. your compiler complains about std::cout << test (arga, argb) because there is no function in scope named test that takes two arguments corresponding to arga, argv. test, in your snippet, is a member-function that belongs to an entity, it's not callable by its own.

3
додано
elements[i]->test (arga, argb)

Якщо ми розібрати твердження, читаючи з зліва направо , ми опинимося нижче:

  1. access the ith element in an array (or array-like) entity named elements

  2. the element accessed (elements[i]) is a pointer to an object

  3. call the member-function named test on elements[i] and pass it two arguments; arga and argb

if we disregard the fact that you wrote std::cout >> instead of std::cout << (the latter is the correct form), we end up with two reasons for your described errors:

  1. your compiler complains about std::cout << element[i] because no suitable overload is found to handle an entity of the type of element[i] and an std::ostream& (which is the underlying type of std::cout).

  2. your compiler complains about std::cout << test (arga, argb) because there is no function in scope named test that takes two arguments corresponding to arga, argv. test, in your snippet, is a member-function that belongs to an entity, it's not callable by its own.

3
додано

Ласкаво просимо на C ++.

По-перше, синтаксис для виводу:

cout<<
instead of
cout>>

Ви впевнені, що це тест - це функція, яка повертає булево. Ось елементи [i] - це вказівник на елемент struct, який має цю тестову функцію.

Щоб вивчити C ++, ви можете скористатися цими статтями , які я написав. Дякую!

1
додано

Ласкаво просимо на C ++.

По-перше, синтаксис для виводу:

cout<<
instead of
cout>>

Ви впевнені, що це тест - це функція, яка повертає булево. Ось елементи [i] - це вказівник на елемент struct, який має цю тестову функцію.

Щоб вивчити C ++, ви можете скористатися цими статтями , які я написав. Дякую!

1
додано

Ласкаво просимо на C ++.

По-перше, синтаксис для виводу:

cout<<
instead of
cout>>

Ви впевнені, що це тест - це функція, яка повертає булево. Ось елементи [i] - це вказівник на елемент struct, який має цю тестову функцію.

Щоб вивчити C ++, ви можете скористатися цими статтями , які я написав. Дякую!

1
додано

Оскільки багато респондентів сказали мені, що мені потрібно надати код, перш ніж вони зможуть відповісти, я подивився глибше в коді та переписав щось, що говорить мені, що рядок:

if (elements[i]->test(arga, argb)) {}  

це тест, щоб перевірити, чи дійсна функція логічних елементів елементів [i].

The C++ program that I wrote to identify the meaning of -> in this context is:

#include "stdafx.h"
#include 
#include 
#include 

template
class Bone
{
public:
    std::string myName;
    int mySize;
    Bone(const std::string &name, const int &size) : myName(name), mySize(size)
    {}
    bool isBigger(const int &testSize) const
    {
        if (testSize > mySize) return false;
        else return true;
    }
};

int main(int argc, char **argv)
{
    std::vector *> bones;
   //name, location, size
    bones.push_back(new Bone("femur", 10));
    bones.push_back(new Bone("ulna", 4));
    bones.push_back(new Bone("maxilla", 3));

    int testSize = 6;
   //test each bone to see if it is bigger than testSize
    for (unsigned i = 0; i < bones.size(); ++i) {
        if (bones[i]->isBigger(testSize)) {
            std::cout << bones[i]->myName; std::cout << " is bigger than testSize! " << std::endl;
        }
    }

    while (!bones.empty()) {
        Bone *thisBone = bones.back();
        bones.pop_back();
        delete thisBone;
    }
    return 0;
}

Дякую усім, хто велів мене зрозуміти це.

0
додано

Оскільки багато респондентів сказали мені, що мені потрібно надати код, перш ніж вони зможуть відповісти, я подивився глибше в коді та переписав щось, що говорить мені, що рядок:

if (elements[i]->test(arga, argb)) {}  

це тест, щоб перевірити, чи дійсна функція логічних елементів елементів [i].

The C++ program that I wrote to identify the meaning of -> in this context is:

#include "stdafx.h"
#include 
#include 
#include 

template
class Bone
{
public:
    std::string myName;
    int mySize;
    Bone(const std::string &name, const int &size) : myName(name), mySize(size)
    {}
    bool isBigger(const int &testSize) const
    {
        if (testSize > mySize) return false;
        else return true;
    }
};

int main(int argc, char **argv)
{
    std::vector *> bones;
   //name, location, size
    bones.push_back(new Bone("femur", 10));
    bones.push_back(new Bone("ulna", 4));
    bones.push_back(new Bone("maxilla", 3));

    int testSize = 6;
   //test each bone to see if it is bigger than testSize
    for (unsigned i = 0; i < bones.size(); ++i) {
        if (bones[i]->isBigger(testSize)) {
            std::cout << bones[i]->myName; std::cout << " is bigger than testSize! " << std::endl;
        }
    }

    while (!bones.empty()) {
        Bone *thisBone = bones.back();
        bones.pop_back();
        delete thisBone;
    }
    return 0;
}

Дякую усім, хто велів мене зрозуміти це.

0
додано

Оскільки багато респондентів сказали мені, що мені потрібно надати код, перш ніж вони зможуть відповісти, я подивився глибше в коді та переписав щось, що говорить мені, що рядок:

if (elements[i]->test(arga, argb)) {}  

це тест, щоб перевірити, чи дійсна функція логічних елементів елементів [i].

The C++ program that I wrote to identify the meaning of -> in this context is:

#include "stdafx.h"
#include 
#include 
#include 

template
class Bone
{
public:
    std::string myName;
    int mySize;
    Bone(const std::string &name, const int &size) : myName(name), mySize(size)
    {}
    bool isBigger(const int &testSize) const
    {
        if (testSize > mySize) return false;
        else return true;
    }
};

int main(int argc, char **argv)
{
    std::vector *> bones;
   //name, location, size
    bones.push_back(new Bone("femur", 10));
    bones.push_back(new Bone("ulna", 4));
    bones.push_back(new Bone("maxilla", 3));

    int testSize = 6;
   //test each bone to see if it is bigger than testSize
    for (unsigned i = 0; i < bones.size(); ++i) {
        if (bones[i]->isBigger(testSize)) {
            std::cout << bones[i]->myName; std::cout << " is bigger than testSize! " << std::endl;
        }
    }

    while (!bones.empty()) {
        Bone *thisBone = bones.back();
        bones.pop_back();
        delete thisBone;
    }
    return 0;
}

Дякую усім, хто велів мене зрозуміти це.

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147