Передача ссылки на объект в переменную экземпляра класса Без допустимой перегрузки ‘=’

#c

Вопрос:

Я больше программист на Java, но в настоящее время мне приходится использовать C для выполнения проекта.

Я застрял на попытке передать ссылку на объект переменной экземпляра другого объекта (a-это отношение). В основном, назначение ссылки на ofApp классу MyMesh и контекстной переменной.

Однако при этом возвращается ошибка «нет жизнеспособной перегрузки»=».

Вот сетка.гэс, mesh.cpp:

 #ifndef mesh_hpp
#define mesh_hpp

#include <stdio.h>

class ofApp;

class Triangle {
public:
    Triangle(int i1, int i2, int i3) { vertInd[0] = i1, vertInd[1] = i2, vertInd[2] = i3; }
    int vertInd[3];
};

class MyMesh {
public:
    MyMesh(ofAppamp; context);
    
    
    vector<glm::vec3> verts;
    vector<Triangle> triangles;
     
//    vector<std::array<int, 3>> triangleIndices;
    
    ofApp amp;context;
    
    
};

#endif /* mesh_hpp */

#include "mesh.hpp"

class ofApp;

MyMesh::MyMesh(ofAppamp; acontext){
    context = acontext; //no viable overloaded '='
}
 

Вот приложение.h, ofApp.cpp:

 #pragma once

#include "ofMain.h"
#include "mesh.hpp"

class MyMesh;

class ofApp : public ofBaseApp{

    public:
        ofApp();

        MyMesh amp;mesh;
        
};

ofApp::ofApp(){
    mesh = MyMesh(*this);
}

 

Комментарии:

1. «Ссылки» на C имеют только общее название с «ссылками» на Java. Почему вы используете их здесь? (Языки имеют очень мало общего, кроме пунктуации и написания некоторых ключевых слов.)

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

3. @molbdnilo Я пытаюсь передать объект ofApp в класс Mesh, чтобы объект ofApp был доступен при использовании класса Mesh. В Java вы можете просто передать объект «адрес», и переменная сетки будет назначена, возможно, я делаю это неправильно в данном случае?

4. @j6t Я действительно столкнулся с проблемой при импорте двух файлов, где они имеют взаимные ссылки друг на друга. Я помню, как читал, что решение состоит в том, чтобы создать прямую ссылку на класс и объявить все переменные экземпляра в классе как указатель/ссылку. Может быть, я неправильно это понял?

5. @zychin У вас будет проблема: для создания экземпляра a ofApp вам понадобится экземпляр MyMesh , но для создания экземпляра a MyMesh вам понадобится ofApp первый. Этого требуют ссылочные члены. Нет никакого способа заставить это работать без обмана. Это указывает на слабое место в дизайне. (Поскольку вы родом с Java, я подозреваю, что это желание привнести объектную ориентацию в чрезмерно нетерпеливой манере.)

Ответ №1:

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

Комментарии:

1. Я понимаю. В принципе, ссылка-это в основном указатель, который является окончательным и не может быть изменен?

2. @zychin вы можете рассматривать ссылку как псевдоним для фактического объекта. Он должен быть инициализирован и не может быть восстановлен.

3. да, ссылка в c реализована компилятором так же, как указатель, но у программистов не будет никакого смысла в этом. и после инициализации вы не можете изменить его на ссылку на другой объект, и ссылка никогда не будет равна нулю, поэтому он не является гибким в качестве указателей, но делает коды более простыми и читаемыми.