Witam, zawsze miałem pewne trudności ze wskaźnikami, i teraz trafiłem na coś, czego nie mogę przeskoczyć. Weźmy sobie, dajmy na to, taki kawałek kodu (w zarządzanym, .Netowym C++):
Vertex.h:
#pragma once
#include "..\Math\Vector.h"
//reprezentuje punkt (wierzchołek) w przestrzeni
ref class Vertex
{
Vector ^ coords; //współrzędne wierzchołka
public:
Vector ^ GetCoords(); //------------------------------INTERESUJĄCA MNIE LINIJKA
Vertex(Vector ^ newCoords); //konstruktor
Vertex.cpp:
#include "Vertex.h"
Vector ^ Vertex::GetCoords() //-----------------------------INTERESUJĄCA MNIE LINIJKA
{
return coords;
}
Vertex::Vertex(Vector ^ newCoords)
{
coords = newCoords;
}
Vector jest inną klasą którą sobie napisałem, nieistotne co w niej jest.
Chodzi o tę funkcję GetCoords. W zamierzeniu jest ona po to, aby ktoś używając obiektu klasy Vertex, mógł odczytać współrzędne tego wierzchołka, ale nie mógł ich sobie zmienić. Tylko z tego co wiem o wskaźnikach, wydaje mi się, że jeżeli zwracam wskaźnik na Vector (Vector ^) reprezentujący te współrzędne, to potem ten ktoś ma dostęp nie do kopii wektora, ale do niego samego. A mnie zależy właśnie na zwróceniu nie wskaźnika na ten wektor, ale kopii tego, na co pokazuje wskaźnik. O ile się nie mylę, w normalnym C++ wyglądałoby to tak:
Vector * coords; //Niezarządzany wskaźnik na Vector
Vector GetCoords(); //Deklaracja
Vector Vertex::GetCoords() //Definicja
{
return * coords; //To, na co pokazuje wskaźnik
}
Ale gdy próbuję coś takiego zrobić w zarządzanym C++ (czyli * zamieniam na ^), kompilator zwraca mi błędy:
error C3192: syntax error : '^' is not a prefix operator (did you mean '*'?)
error C3073: 'Vector' : ref class does not have a user-defined copy constructor
Wklepałem to 1. w MSDNa, wyszło mi że przy odniesieniu do tego, na co pokazuje wskaźnik powinienem i tak użyć *, mimo że to wskaźnik ^. Ale jak to robię, to i tak zostaje mi ten drugi błąd (C3073). I nie mogę zrozumieć co ma do tego konstruktor kopiujący...