#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
, но для создания экземпляра aMyMesh
вам понадобитсяofApp
первый. Этого требуют ссылочные члены. Нет никакого способа заставить это работать без обмана. Это указывает на слабое место в дизайне. (Поскольку вы родом с Java, я подозреваю, что это желание привнести объектную ориентацию в чрезмерно нетерпеливой манере.)
Ответ №1:
в c ссылочная переменная должна быть инициализирована при объявлении, и вы не можете изменить привязку ссылки, инициализация не может быть отложена. Поэтому, если вы хотите установить ссылку позже, вам следует использовать указатель.
Комментарии:
1. Я понимаю. В принципе, ссылка-это в основном указатель, который является окончательным и не может быть изменен?
2. @zychin вы можете рассматривать ссылку как псевдоним для фактического объекта. Он должен быть инициализирован и не может быть восстановлен.
3. да, ссылка в c реализована компилятором так же, как указатель, но у программистов не будет никакого смысла в этом. и после инициализации вы не можете изменить его на ссылку на другой объект, и ссылка никогда не будет равна нулю, поэтому он не является гибким в качестве указателей, но делает коды более простыми и читаемыми.