|
As matter of fact, you don't need a pointer. Try
#include <iostream>
using namespace std;
namespace MyNamespace
{
class MyObject
{
int m_i;
public:
MyObject(int i):m_i(i){}
int get_i(){return m_i;}
};
}
struct MyStruct
{
MyNamespace::MyObject myObject;
};
static MyStruct s_myStruct = { MyNamespace::MyObject(5) };
int main()
{
cout << s_myStruct.myObject.get_i() << endl;
}
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
I'm able to compile your code example. However, I just realized that I had forgotten the following line of code (I didn't think it was important) in my first post (I have added it now):
MyObject(const MyObject&) = delete; I'm not good at programming C++ so I'm not sure what that line does. After I have added this line, I get the following error message with your code example: "use of deleted function 'MyNamespace::MyObject::MyObject(const MyNamespace::MyObject&)"
|
|
|
|
|
|
I'm not allowed to make changes inside the class, I'm only supposed to write code that uses that class.
|
|
|
|
|
The line prohibits compiler from copying MyObject objects.
Look at the following code to better understand what's going on:
namespace MyNamespace
{
class MyObject
{
int m_i;
public:
MyObject (int i) :m_i (i + 1) { cout << "MyObject constructor i=" << i << endl; }
MyObject (const MyObject&) = delete; int get_i () const { return m_i; }
};
}
struct MyStruct
{
MyStruct (const MyNamespace::MyObject& r) : myObject (r.get_i ()) { cout << "MyStruct constructor" << endl; }
MyNamespace::MyObject myObject;
};
static MyStruct s_myStruct { MyNamespace::MyObject (5) };
int main ()
{
cout << s_myStruct.myObject.get_i () << endl;
} The output is:
MyObject constructor i=5
MyObject constructor i=6
MyStruct constructor
7
Mircea
|
|
|
|
|
Fine.
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
Your code is correct but dangerous. You don’t control the time when myStruct is initialized. There are various methods to control it. My preferred method is the nifty counter[^].
In general, you can include objects in structures. As a matter of fact C++ makes little difference between the two. Without seeing the code, I suspect that your problem is that you don’t have a default constructor for your object. Let me explain: as you don’t have a default constructor for myStruct , the compiler will synthesize one that invokes the default constructor for any included non-trivial members. If your object doesn’t have a default constructor, the compiler complains.
Mircea
|
|
|
|
|
I edited my initial post to also show the actual class.
|
|
|
|
|
Good Morning.
In my view class in the onDraw() function, I am drawing the board and filling in the squares as follows:
pDC->SetMapMode(MM_LOENGLISH);
pDC->SetWindowExt(800, 800);
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
COLORREF color = pBC->getSquare(i, j);
CBrush brush(color);
int x1 = (j * 70) + 35;
int y1 = (i * -70) - 35;
int x2 = x1 + 70;
int y2 = y1 - 70;
CRect rect(x1, y1, x2, y2);
pDC->FillRect(rect, &brush);
}
}
for (int x = 35; x <= 595; x += 70)
{
pDC->MoveTo(x, -35);
pDC->LineTo(x, -595);
}
for (int y = -35; y >= -595; y -= 70)
{
pDC->MoveTo(35, y);
pDC->LineTo(595, y);
}
This all works well, and I have my board coming up.
Now I want to draw the chess pieces on the board, and have written some code, just to load 1 bitgmap and display it on the screen. However, nothing gets drawn to the screen. (All I see is just the chessboard)
This is the test code to display my bitmap on the screen:
void CMyChessTestView::drawImage(CDC* pDC, int x, int y)
{
CPaintDC dc(this);
CBitmap BmpLady;
CDC MemDCLady;
BmpLady.LoadBitmap(IDB_BISHOP_WHITE);
MemDCLady.CreateCompatibleDC(pDC);
CBitmap *BmpPrevious = MemDCLady.SelectObject(&BmpLady);
pDC->BitBlt(20, 10, 436, 364, &MemDCLady, 0, 0, SRCCOPY);
pDC->SelectObject(BmpPrevious);
The bitmap is not drwan to the screen. I have tried using both the CPaintDC dc or the pDC* but to no avail. I cannot get the bitmap to display.
Any suggestions will be greatly appreciated.
|
|
|
|
|
How do you call the drawImage method?
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
drawImage(pDC, 100, 100);
|
|
|
|
|
BigSteve-O wrote: drawImage(pDC, 100, 100);
And where are you calling this method from?
|
|
|
|
|
From the onDraw() funtion.
|
|
|
|
|
A similar code draws the bitmap, on my system. Why didn't you check the return value of the LoadBitmap call?
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
It looks like loadBitmap returns NULL. I have no idea as to why though.
Do you have a code snippet you can share?
|
|
|
|
|
BigSteve-O wrote: It looks like loadBitmap returns NULL. I have no idea as to why though.
According to Docs in CBitmap Class | Microsoft Learn :
Quote: If the bitmap identified by lpszResourceName does not exist or if there is insufficient memory to load the bitmap, the function returns 0.
|
|
|
|
|
|
|
Thank You.
I copied the sample code over, and I have noticed the following:
1) If I draw the bitmap first, and then draw the board afterwards, I can see the board and the test bitmap.
2) If I draw the board first and then the test bitmap, I only see the board. The loadBitmap call is successfull)
|
|
|
|
|
That's rather strange. Do you use the same DC for the board and bitmap?
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
|
|
Here is my onDraw()
void CMyChessTestView::OnDraw(CDC* pDC)
{
CMyChessTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
drawImage(pDC, 100, 100);
drawEmptyBoard(pDC);
}
Here is the drawImage(...)
void CMyChessTestView::drawImage(CDC* pDC, int x, int y)
{
CBitmap bmp;
if (bmp.LoadBitmap(IDB_LADYPIC))
{
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap *pOldBitmap = dcMemory.SelectObject(&bmp);
CRect rect;
GetClientRect(&rect);
int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
else
{
TRACE0("ERROR: Where's IDB_LADYPIC?\n");
}
}
Here is the drawEmptyBoard()
void CMyChessTestView::drawEmptyBoard(CDC* pDC)
{
CMyChessTestDoc* pBC = GetDocument();
ASSERT_VALID(pBC);
if (!pBC)
return;
pDC->SetMapMode(MM_LOENGLISH);
pDC->SetWindowExt(800, 800);
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
COLORREF color = pBC->getSquare(i, j);
CBrush brush(color);
int x1 = (j * 70) + 35;
int y1 = (i * -70) - 35;
int x2 = x1 + 70;
int y2 = y1 - 70;
CRect rect(x1, y1, x2, y2);
pDC->FillRect(rect, &brush);
}
}
for (int x = 35; x <= 595; x += 70)
{
pDC->MoveTo(x, -35);
pDC->LineTo(x, -595);
}
for (int y = -35; y >= -595; y -= 70)
{
pDC->MoveTo(35, y);
pDC->LineTo(595, y);
}
|
|
|
|
|
Really?
You draw the chess piece first and then draw the chess board on top of it?
|
|
|
|
|
No, It serves to demonstrate that if I draw the board first, the pieces will not show up, and that by drawing the piece first and then the board, all shows up.
|
|
|
|