0

what's wrong with this code in VC++ 2008 Ex

#include <conio.h>
#include <iostream>
using namespace std;

class Allocate
{
private:

	void* v;
	unsigned n;
	__int8 dummy_ret;

	void* Alloc(unsigned& n)
	{
		void* ret;
		if(n == 0)
			ret = 0;
		else
		{
			ret = new(nothrow) char[n];
			if(ret == 0)
				n = 0;
		}
		return ret;
	}

	void Free()
	{
		if(n != 0)
			delete [] v;
		n = 0;
	}

public:
	unsigned GetSize()
	{
		return n;
	}

	void SetSize(unsigned size)
	{
		SetData(v,size);
	}

	void* GetData()
	{
		return v;
	}

	void SetData(void* data,unsigned size)
	{
		if(size == 0)
			return;
		char* w = (char*)Alloc(size);
		for(unsigned i = 0; i < size; i++)
			w[i] = ((char*)data)[i];
		Free();
		v = w;
		this -> n = size;
	}

	__int8& operator [](unsigned i)
	{
		if(i < n)
			return ((char*)v)[i];
		else
			return dummy_ret;
	}

	Allocate& operator =(const Allocate& a)
	{
		SetData(a.GetData(),a.GetSize());
		return *this;
	}

	Allocate& operator ++()
	{
		SetSize(GetSize() + 1);
		return *this;
	}

	Allocate(unsigned n)
	{
		v = Alloc(n);
		this -> n = n;
	}

	Allocate(void* w,unsigned size)
	{
		n = 0;
		SetData(w,size);
	}

	Allocate(const Allocate& a)
	{
		*this = a;
	}

	~Allocate()
	{
		dummy_ret = 0;
		Free();
	}
};

int main()
{
	Allocate a("hello",6);
	cout<< a[0];
	_getch();
}

Error 1 error C2662: 'Allocate::GetData' : cannot convert 'this' pointer from 'const Allocate' to 'Allocate &' g:\important files\my documents\borland studio projects\console.cpp 72
Error 2 error C2662: 'Allocate::GetSize' : cannot convert 'this' pointer from 'const Allocate' to 'Allocate &' g:\important files\my documents\borland studio projects\console.cpp 72

3
Contributors
3
Replies
4
Views
7 Years
Discussion Span
Last Post by CppBuilder2006
Featured Replies
  • 1
    Narue 5,707   7 Years Ago

    GetData and GetSize are called on objects that are qualified as const. In such a case the compiler has to assume that both of those functions modify the state of the object, so it disallows the call. You can fix it by qualifying the two member functions as const since … Read More

  • Your GetData and GetSize functions need to be declared const e.g. [CODE] unsigned GetSize() const // This { return n; } [/CODE] [CODE] void* GetData() const // and this needs to be const { return v; } [/CODE] Because the parameter 'a' to the Allocate classes operator = override function … Read More

1

GetData and GetSize are called on objects that are qualified as const. In such a case the compiler has to assume that both of those functions modify the state of the object, so it disallows the call. You can fix it by qualifying the two member functions as const since they don't actually modify the state:

unsigned GetSize() const
{
	return n;
}

void* GetData() const
{
	return v;
}
1

Your GetData and GetSize functions need to be declared const
e.g.

unsigned GetSize() const // This
	{
		return n;
	}
void* GetData() const // and this needs to be const
	{					
		return v;
	}

Because the parameter 'a' to the Allocate classes operator = override function has been declared as a constant reference to an Allocate object, then the GetData and SetSize functions have to be declared as const otherwise the compiler thinks that they might attempt to modify the Allocate object....If you follow me!

Cheers for now,
Jas.

edit:
Dammit, beaten to the punch again!

Edited by JasonHippy: n/a

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.