|
Well, if I state it is a precondition then I don't check it (i.e. I may check it in Debug build, not in Release one).
BTW approach (1) is possibly better because it frees Derived class methods from implementing checking logic (I mean, using approach (2) you must remember to call foo(i) and this is not good expecially if Derived class developer is not the same person who designed Base class).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
Do you have some formal samples about pre- and post- condition pattern simple POC implementation? I have performed some search but can not find relevant stuff. Or you think my implementation is good enough.
Any ideas or recommendations?
regards,
George
|
|
|
|
|
No, I haven't.
I still stand in my original opinion: if I state a precondition then I haven't to check it.
Anyway, I like your first approach.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
With your agreement on my 1st approach of implementation, I think I am confident enough.
regards,
George
|
|
|
|
|
See here[^].
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
So, you prefer implementation 1, I think, right, CPallini?
regards,
George
|
|
|
|
|
|
Thanks CPallini,
Can you let me know what is the bug please?
regards,
George
|
|
|
|
|
OK, I do the exercise for you...
int main()
{
Derived d;
d.do_foo (1000);
return 0;
}
in the above code you need to change d.do_foo(1000); to d.foo(1000); to avoid recursion. BTW if you followed Stephen Hewitt's suggestion, declaring private the Derived class do_foo member, then the compiler was able to stop you from committing recursion madness (it's called OOP nemesis).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
You are correct. My bad. Actually, I have not tested it comprehensively. I just show my ideas about what the pattern looks like.
1.
So, if I fix the bug, you think both could be called pre- and post- condition pattern?
2.
If yes, what do you think the pros and cons of each implementation?
regards,
George
|
|
|
|
|
George_George wrote: 1.
So, if I fix the bug, you think both could be called pre- and post- condition pattern?
Well, a Design Pattern is the (at least at time of proposal) best solution to a well known problem. I don't know if one of your examples satisfy this requirement.
However we can say your examples satisfy the pre- condition design constraint.
George_George wrote: 2.
If yes, what do you think the pros and cons of each implementation?
I already asnwered (supposing the code correct) this, here [^].
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks CPallini,
Your reply is clear. I am surprising to see we can not find a reference implementation (in C++, Java or etc.) of pre- and post- condition checkingt design pettern.
Let us just assume my reference implementation (1) is correct.
regards,
George
|
|
|
|
|
Hello everyone,
I am just a little confusing and not 100% confident about the following case. In the following sample, function call foo (called in function goo in class Foo) will call foo in class Goo, other than foo in class Foo, because we are using an instance of Goo g and no matter in which class, right?
(I have tested the result is correct, and I am asking the reason here.)
#include <iostream>
using namespace std;
class Foo {
public:
void goo()
{
foo();
}
private:
virtual void foo() = 0;
};
void Foo::foo()
{
cout << "I am here. " << endl;
}
class Goo : public Foo {
public:
void foo()
{
Foo::foo();
}
};
int main()
{
Goo g;
g.foo();
return 0;
}
thanks in advance,
George
|
|
|
|
|
George_George wrote: because we are using an instance of Goo g and no matter in which class, right?
No, Its instance of Goo and foo is a virtual function. Try foo in Foo as non-virtual function. But i wonder why you ask this simple question after some great questions.
|
|
|
|
|
Sorry, Rajkumar. It is my bad and typo. The code in the original post should be,
int main()
{
Goo g;
g.goo();
return 0;
}
Any comments or replies to my original question?
regards,
George
|
|
|
|
|
What change it seems same to me.
I mean yes it is the instance of Goo, but not only because this the object of Goo, it is because that foo is a virtual function. Since foo is a virtual function in class Foo it is bind at runtime to the final derived class Goo::foo. Lot of useful features using this feature of polymorphism. Base class can call the derive class function without knowing the derived class type, Callbacks in MFC like CWinThread::InitInstance is implemented using this feature that Developer of the library doenot know which is the class user going to create CMyWinThread derived class of CWinThread and overriding the InitInstance causes CMyWinThread::InitInstance is called back at CWinThread class.
|
|
|
|
|
Thanks Rajkumar,
What makes me confused is the pure virtual function, in the past I am not sure whether its behavior is like normal non-virtual function or plain virtual function.
Now I understand it resembles the same behavior as the normal virtual function, right?
regards,
George
|
|
|
|
|
George_George wrote: Now I understand it resembles the same behavior as the normal virtual function, right?
yes, but pure virtual functions requires that derived class must have an implementation while normal virtual function doenot restricts it.
|
|
|
|
|
Thanks Rajkumar,
Question answered.
regards,
George
|
|
|
|
|
Hi.
i know that we can use endl without >> end just like a function call endl(cout) but why cout is passed as parameter?
int life()
{
in a land with no bird, no spring. My first journey was a
return 0;
}
|
|
|
|
|
pourang wrote: endl(cout) but why cout is passed as parameter
this is what the endl function does internally..( from "OSTREAM.H" file )
inline _CRTIMP ostream& __cdecl endl(ostream& _outs) <br />
{ <br />
return _outs << '\n' << flush; <br />
}
Hope you understood...
|
|
|
|
|
thanks, very useful.
int life()
{
in a land with no bird, no spring. My first journey was a
return 0;
}
|
|
|
|
|
endl is actually a function. The magic lies in that ostream has an overloaded << operator that takes a function pointer as the right-side argument. That overload ends up calling endl(cout) . If you step into a "cout << endl" call, you'll see this happening.
|
|
|
|
|
thanks
int life()
{
in a land with no bird, no spring. My first journey was a
return 0;
}
|
|
|
|
|
I want to write a c# program and need to scan for bluetooth devices.
therefore i write a dll in c++ using bluetooth API.
But i keep getting stuk...
1. I only found a way to use bluetooth by c++ , not c#
So i tryed to write a dll in c++ and use those functions in c#
Example :
// bluetoothdll.h
namespace bluetooth
{
class Bluetoothclass
{
public:
static __declspec(dllexport) void WINAPI Scan(LPVOID lpParameter);
};
}
// bluetoothdll.cpp
#include ;
#include ;
#pragma comment ( lib, "Irprops.lib")
#include "bluetoothdll.h"
#define MAX_DEVICE_COUNT 32 // just assumption
BLUETOOTH_DEVICE_INFO device_array[MAX_DEVICE_COUNT] ;
static int device_array_pointer = 0 ; // my cursor variable
namespace Bluetooth
{
void WINAPI BluetoothClass::Scan (LPVOID lpParameter)
{
** my code **
}
}
this wont build : 199 errors in the upper two headerfiles
so i didn't got to the c# part , but i would have wrote it like this :
[DllImport("Bluetoothdll.dll")]
static extern void WINAPI Scan(LPVOID lpParameter);
2. i wanted to make it easyer by writing it all in c++
first i tested this sample i got from internet :
#include <winsock2.h>
#include <ws2bth.h>
#include <BluetoothAPIs.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "irprops.lib")
using namespace std;
int main(){
//Initialising winsock
WSADATA data;
int result;
result = WSAStartup(MAKEWORD(2, 2), &data);//initializing winsock
if (result!=0){
cout << "An error occured while initialising winsock, closing....";
exit(result);
}
//Initialising query for device
WSAQUERYSET queryset;
memset(&queryset, 0, sizeof(WSAQUERYSET));
queryset.dwSize = sizeof(WSAQUERYSET);
queryset.dwNameSpace = NS_BTH;
HANDLE hLookup;
result = WSALookupServiceBegin(&queryset, LUP_CONTAINERS, &hLookup);
if (result!=0){
cout << "An error occured while initialising look for devices, closing....";
exit(result);
}
//Initialisation succedd, start looking for devices
BYTE buffer[4096];
memset(buffer, 0, sizeof(buffer));
DWORD bufferLength = sizeof(buffer);
WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
while (result==0){
result = WSALookupServiceNext(hLookup, LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE | LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE,&bufferLength, pResults);
if(result==0){// A device found
//print the name of the device
LPTSTR s = pResults->lpszServiceInstanceName;
wcout << s << "found. quering for services\n";
//Initialise quering the device services
WSAQUERYSET queryset2;
memset(&queryset2, 0, sizeof(queryset2));
queryset2.dwSize = sizeof(queryset2);
queryset2.dwNameSpace = NS_BTH;
queryset2.dwNumberOfCsAddrs = 0;
CSADDR_INFO * addr = (CSADDR_INFO *)pResults->lpcsaBuffer;
WCHAR addressAsString[1000];
DWORD addressSize = sizeof(addressAsString);
WSAAddressToString(addr->RemoteAddr.lpSockaddr,addr->RemoteAddr.iSockaddrLength,NULL,addressAsString, &addressSize);
queryset2.lpszContext = addressAsString;
GUID protocol = L2CAP_PROTOCOL_UUID;
queryset2.lpServiceClassId = &protocol;
HANDLE hLookup2;
int result2 = WSALookupServiceBegin(&queryset2, LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RETURN_ADDR | LUP_RETURN_BLOB | LUP_RETURN_COMMENT, &hLookup2);
if (result2 !=0){
cout << "An error occured while initializing query for services";
exit(result);
}
//Start quering for device services
while(result2 ==0){
BYTE buffer2[4096];
memset(buffer2, 0, sizeof(buffer2));
DWORD bufferLength2 = sizeof(buffer2);
WSAQUERYSET *pResults2 = (WSAQUERYSET*)&buffer2;
result2 = WSALookupServiceNext(hLookup2,LUP_FLUSHCACHE |LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RETURN_ADDR | LUP_RETURN_BLOB | LUP_RETURN_COMMENT,&bufferLength2,pResults2);
if(result2 == 0)
wcout << "Service found: " << pResults2->lpszServiceInstanceName <<"\n";
}
}
}
return 0;
}
But i also get lots of errors :
Error1 error LNK2001: unresolved external symbol _L2CAP_PROTOCOL_UUID code.obj
Error2 error LNK2019: unresolved external symbol __imp__WSAAddressToStringW@20 referenced in function _main code.obj
Error3 error LNK2019: unresolved external symbol __imp__WSALookupServiceNextW@16 referenced in function _main code.obj
Error4 error LNK2019: unresolved external symbol __imp__WSALookupServiceBeginW@12 referenced in function _main code.obj
Error5 error LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function _main code.obj
Error6 error LNK2019: unresolved external symbol __imp__InterlockedExchange@8 referenced in function ___tmainCRTStartup MSVCRTD.lib
Error7 error LNK2019: unresolved external symbol __imp__Sleep@4 referenced in function ___tmainCRTStartup MSVCRTD.lib
Error8 error LNK2019: unresolved external symbol __imp__InterlockedCompareExchange@12 referenced in function ___tmainCRTStartup MSVCRTD.lib
Error9 error LNK2019: unresolved external symbol __imp__TerminateProcess@8 referenced in function ___report_gsfailure MSVCRTD.lib
Error10 error LNK2019: unresolved external symbol __imp__GetCurrentProcess@0 referenced in function ___report_gsfailure MSVCRTD.lib
Error11 error LNK2019: unresolved external symbol __imp__UnhandledExceptionFilter@4 referenced in function ___report_gsfailure MSVCRTD.lib
Error12 error LNK2019: unresolved external symbol __imp__SetUnhandledExceptionFilter@4 referenced in function ___report_gsfailure MSVCRTD.lib
Error13 error LNK2001: unresolved external symbol __imp__SetUnhandledExceptionFilter@4 MSVCRTD.lib
Error14 error LNK2019: unresolved external symbol __imp__IsDebuggerPresent@0 referenced in function ___report_gsfailure MSVCRTD.lib
Error15 error LNK2001: unresolved external symbol __imp__IsDebuggerPresent@0 MSVCRTD.lib
Error16 error LNK2019: unresolved external symbol __imp__RaiseException@16 referenced in function "int __cdecl DebuggerProbe(unsigned long)" (?DebuggerProbe@@YAHK@Z) MSVCRTD.lib
Error17 error LNK2019: unresolved external symbol __imp__DebugBreak@0 referenced in function "void __cdecl failwithmessage(void *,int,int,char const *)" (?failwithmessage@@YAXPAXHHPBD@Z) MSVCRTD.lib
Error18 error LNK2019: unresolved external symbol __imp__WideCharToMultiByte@32 referenced in function "void __cdecl failwithmessage(void *,int,int,char const *)" (?failwithmessage@@YAXPAXHHPBD@Z) MSVCRTD.lib
Error19 error LNK2019: unresolved external symbol __imp__MultiByteToWideChar@24 referenced in function "void __cdecl failwithmessage(void *,int,int,char const *)" (?failwithmessage@@YAXPAXHHPBD@Z) MSVCRTD.lib
Error20 error LNK2019: unresolved external symbol __imp__lstrlenA@4 referenced in function "void __cdecl _RTC_AllocaFailure(void *,struct _RTC_ALLOCA_NODE *,int)" (?_RTC_AllocaFailure@@YAXPAXPAU_RTC_ALLOCA_NODE@@H@Z) MSVCRTD.lib
Error21 error LNK2019: unresolved external symbol __imp__GetProcAddress@8 referenced in function "void __cdecl _RTC_AllocaFailure(void *,struct _RTC_ALLOCA_NODE *,int)" (?_RTC_AllocaFailure@@YAXPAXPAU_RTC_ALLOCA_NODE@@H@Z) MSVCRTD.lib
Error22 error LNK2001: unresolved external symbol __imp__GetProcAddress@8 MSVCRTD.lib
Error23 error LNK2019: unresolved external symbol __imp__LoadLibraryA@4 referenced in function "void __cdecl _RTC_AllocaFailure(void *,struct _RTC_ALLOCA_NODE *,int)" (?_RTC_AllocaFailure@@YAXPAXPAU_RTC_ALLOCA_NODE@@H@Z) MSVCRTD.lib
Error24 error LNK2001: unresolved external symbol __imp__LoadLibraryA@4 MSVCRTD.lib
Error25 error LNK2019: unresolved external symbol __imp__QueryPerformanceCounter@4 referenced in function ___security_init_cookie MSVCRTD.lib
Error26 error LNK2019: unresolved external symbol __imp__GetTickCount@0 referenced in function ___security_init_cookie MSVCRTD.lib
Error27 error LNK2019: unresolved external symbol __imp__GetCurrentThreadId@0 referenced in function ___security_init_cookie MSVCRTD.lib
Error28 error LNK2019: unresolved external symbol __imp__GetCurrentProcessId@0 referenced in function ___security_init_cookie MSVCRTD.lib
Error29 error LNK2019: unresolved external symbol __imp__GetSystemTimeAsFileTime@4 referenced in function ___security_init_cookie MSVCRTD.lib
Error30 error LNK2019: unresolved external symbol __imp__HeapFree@12 referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z) MSVCRTD.lib
Error31 error LNK2019: unresolved external symbol __imp__HeapAlloc@12 referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z) MSVCRTD.lib
Error32 error LNK2019: unresolved external symbol __imp__GetProcessHeap@0 referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z) MSVCRTD.lib
Error33 error LNK2019: unresolved external symbol __imp__GetModuleFileNameW@12 referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z) MSVCRTD.lib
Error34 error LNK2019: unresolved external symbol __imp__VirtualQuery@12 referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z) MSVCRTD.lib
Error35 error LNK2019: unresolved external symbol __imp__FreeLibrary@4 referenced in function "struct HINSTANCE__ * __cdecl GetPdbDll(void)" (?GetPdbDll@@YAPAUHINSTANCE__@@XZ) MSVCRTD.lib
so please give me a good tip or a sample that works
once i get this working i can start writing my program.
thanks
Blue Doorman
|
|
|
|
|