473,738 Members | 1,949 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

explicit call of constructor and destructor

Hi Everyone,

I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?

class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};

int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();
}
Dec 3 '07 #1
12 7205
On Dec 3, 9:55 pm, Rahul <sam_...@yahoo. co.inwrote:
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?

class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}

};

int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();

Calling the destructor twice is undefined behavior. The only place
where explicitly calling the destructor is required and justified is
when you used placement new to do the constructor over a pre-allocated
buffer. The placement new can be considered as being an explicit call
to the constructor as that is what it actually does.
Dec 3 '07 #2
Rahul wrote:
Hi Everyone,

I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?

class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};

int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
Correct. The line before this one invokes your constructor. What
are you trying to do here?
obj.~Trial();
This will cause undefined behaviour when your 'main' function ends.
The destructor for the local obejct 'obj' will be called again.
Why are you trying to invoke the destructor here?
}
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Dec 3 '07 #3
On Dec 3, 10:06 pm, Abhishek Padmanabh <abhishek.padma n...@gmail.com>
wrote:
On Dec 3, 9:55 pm, Rahul <sam_...@yahoo. co.inwrote:
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?
class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};
int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();

Calling the destructor twice is undefined behavior. The only place
where explicitly calling the destructor is required and justified is
when you used placement new to do the constructor over a pre-allocated
buffer. The placement new can be considered as being an explicit call
to the constructor as that is what it actually does.
I'm sorry i didn't get ur point, could u give an example?
Dec 3 '07 #4
On Dec 3, 10:19 pm, Rahul <sam_...@yahoo. co.inwrote:
On Dec 3, 10:06 pm, Abhishek Padmanabh <abhishek.padma n...@gmail.com>
wrote:


On Dec 3, 9:55 pm, Rahul <sam_...@yahoo. co.inwrote:
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?
class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};
int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();
Calling the destructor twice is undefined behavior. The only place
where explicitly calling the destructor is required and justified is
when you used placement new to do the constructor over a pre-allocated
buffer. The placement new can be considered as being an explicit call
to the constructor as that is what it actually does.

I'm sorry i didn't get ur point, could u give an example?
Example:

#include<new>

class A
{
//members
};

int main()
{
//allocate buffer
char* buffer = new char[sizeof(A)];
//construct A on that memory space
A * ptrToA = ::new (buffer) A();
//destroy the object
ptrToA->~A();
//deallocate the buffer
delete[] buffer;
}

One instance where you can find placement new usage is the standard
containers. The allocator takes in the responsibility to allocate the
buffer (allocate member) and the objects are constructed over that
buffer as they are added into the container. For example, when you do
reserve on vector object, it reserves the space for N objects meaning
allocates space for N objects but does not construct them. Then when
you do push_back etc, to add elements, they are created over that
buffer. Basically, it is a technique to reduce the overhead of
repeated calls to memory allocation function. And then when done, the
vector destructor would destroy the objects calling the destructor
explicitly for all objects in it and then call the deallocate()
function of the allocator to release the memory. Hope this helps.
Dec 3 '07 #5
On Dec 3, 11:14 pm, "Alf P. Steinbach" <al...@start.no wrote:
* Abhishek Padmanabh:
On Dec 3, 9:55 pm, Rahul <sam_...@yahoo. co.inwrote:
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?
class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};
int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();
Calling the destructor twice is undefined behavior. The only place
where explicitly calling the destructor is required and justified is
when you used placement new to do the constructor over a pre-allocated
buffer.

That's a bit too sweeping a statement, I'm afraid.

Better to say, as a novice, don't call destructors.
Where else would one call the destructor if they are not using
placement new?

The placement new can be considered as being an explicit call
to the constructor as that is what it actually does.

Uh oh. No, that's a very very dangerous misconception.

Let's first establish what an explicit constructor call is: it is any
syntactical form that suffices to call a constructor that has been
declared as "explicit", because that's what that keyword means, it
imposes a requirement to use explicit constructor calls.
The word explicit that I used was not the C++ keyword explicit. By
explicit, I simply meant it is not implicit. We have a placement new
syntax to do that. Not as the OP has called the constructor, not if
the constructor is declared explicit or not, but when you call
placement new. Had the OP's syntax been allowed, that would be an
explicit call to the constructor. Sorry, if the "explicit constructor
call" sounded confusing.
Unfortunately many folks are completely unable to grasp both the
"explicit" and the "call" part of that, and for them I have had to use
the fallacy of authority argument, showing articles by Bjarne Stroustrup
and Andrew Koenig etc. that use this terminology. Not surprisingly,
they respond better to the fallacious authority argument than to logic.
However, if you're one such person, do the googling yourself, please.
I am not sure I understand what you are suggesting to google for. :)
Now, in placement new you supply constructor arguments that are
/forwarded/ to the constructor.
"Forwarding " is a better choice.
This is crucial, because the
constructor might throw an exception. The placement new expression sets
up an exception handler first of all, which has responsibility for
deallocation, before it calls the constructor for you -- the explicit
syntactical constructor call in the expression is, at the level of
execution, a wrapped call.
Sorry, this is new to me. How could the handler be set up by the
placement new call? The handler has to be in the code wrapping the
placement new call. For the example I have above, that exception
should remain uncaught. In case of an exception from A's constructor
(considering it is not as trivial as I have shown and can throw
something) any deallocation should not happen.

So the explicitness of the constructor call expression (or not) in a
placement new is irrelevant, and should not be confused with what the
keyword "explicit" requires: what is relevant for placement new is that
one particular placement new (namely the one defined in <new>) allows
you to call a constructor on existing storage.
Yes, that is what I meant.
Dec 4 '07 #6
On Dec 3, 7:14 pm, "Alf P. Steinbach" <al...@start.no wrote:
* Abhishek Padmanabh:
On Dec 3, 9:55 pm, Rahul <sam_...@yahoo. co.inwrote:
I have the following code and i'm able to invoke the destructor
explicitly but not the constructor. and i get a compile time error
when i invoke the constructor, why is this so?
class Trial
{
public: Trial()
{
printf("Trial\n ");
}
~Trial()
{
printf("~Trial\ n");
}
};
int main()
{
Trial obj;
obj.Trial(); // Causes compile time error
obj.~Trial();
Calling the destructor twice is undefined behavior. The only place
where explicitly calling the destructor is required and justified is
when you used placement new to do the constructor over a pre-allocated
buffer.
That's a bit too sweeping a statement, I'm afraid.
Better to say, as a novice, don't call destructors.
Which is even more sweeping, no?
The placement new can be considered as being an explicit call
to the constructor as that is what it actually does.
Uh oh. No, that's a very very dangerous misconception.
Let's first establish what an explicit constructor call is: it is any
syntactical form that suffices to call a constructor that has been
declared as "explicit", because that's what that keyword means, it
imposes a requirement to use explicit constructor calls.
Woah. That's not what the standard says. What the standard
says is that a constructor declared as explicit cannot be used
for implicit conversions. It then goes on to say more about
some additional cases, e.g. explicit default constructors,
explicit copy constructors, etc.. A naïve reader might be
confused, and ask what type conversions have to do with these,
but since the standard also says that an expression of the form
"A()", "A(anotherA )" or "A(1,2,3)" (where A is the name of a
type) is an "explicit type conversion (functional notation)",
why not?

Now, I'll admit that I find it very hard to see where this
nomenclature comes from. I can't really see how "A()", or
"A(1,2,3)" could be a "type conversion", explicit or not,
regardless of the notation. I rather find your wording
preferable, and would like something like "explicit creation of
a temporary" even better. But the standard is the standard.
Unfortunately many folks are completely unable to grasp both
the "explicit" and the "call" part of that, and for them I
have had to use the fallacy of authority argument, showing
articles by Bjarne Stroustrup and Andrew Koenig etc. that use
this terminology. Not surprisingly, they respond better to
the fallacious authority argument than to logic. However, if
you're one such person, do the googling yourself, please.
The problem is that 1) we're not talking about logic, we're
talking about the standard---those are two radically different
things---, and 2) such expressions don't just call the
constructor, so logically, they can't strictly be considered
"explicit constructor calls". No matter what anyone says.
Now, in placement new you supply constructor arguments that
are /forwarded/ to the constructor. This is crucial, because
the constructor might throw an exception. The placement new
expression sets up an exception handler first of all, which
has responsibility for deallocation, before it calls the
constructor for you -- the explicit syntactical constructor
call in the expression is, at the level of execution, a
wrapped call.
It depends. Unless there is a corresponding placement delete,
the compiler doesn't do anything to free the memory in case of
an exception. (On the other hand, if an expression like "A()"
terminates via an exception, the compiler does free the
allocated memory. Always.)
So the explicitness of the constructor call expression (or
not) in a placement new is irrelevant, and should not be
confused with what the keyword "explicit" requires: what is
relevant for placement new is that one particular placement
new (namely the one defined in <new>) allows you to call a
constructor on existing storage.
One particular standard placement new. You could very well
define others yourself. (Can't think of why you would want to,
but there's certainly nothing forbidding it.)

What is important, of course, is that placement new is a
placement new (regardless of whether the operator new function
returns the address of some pre-existing buffer or allocates new
memory), not an "explicit constructor call". In fact, I can't
find any section in section 5 which describes an "explicit
constructor call". The only way to "call" a constructor is as
an indirect effect of some other expression or statement: a type
conversion (implicit or explicit), a declaration or a new
operator (or a throw, or when passing value parameters to a
function, or when returning a value, or ...).

--
James Kanze (GABI Software) email:ja******* **@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientier ter Datenverarbeitu ng
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Dec 4 '07 #7
On Dec 4, 4:47 am, Abhishek Padmanabh <abhishek.padma n...@gmail.com>
wrote:

[...]
This is crucial, because the
constructor might throw an exception. The placement new expression sets
up an exception handler first of all, which has responsibility for
deallocation, before it calls the constructor for you -- the explicit
syntactical constructor call in the expression is, at the level of
execution, a wrapped call.
Sorry, this is new to me. How could the handler be set up by
the placement new call?
There are four different ways the compiler can generate code for
a new expression, depending on whether there is a corresponding
(placement) delete, and whether the operator new function is
declared not to throw or not. Basically (for p = new T):

corresponding delete, operator new() may throw:

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
try {
T::constructor( tmp ) ;
} catch ( ... ) {
operator delete( tmp /* , any placement params. */ ) ;
throw ;
}

corresponding delete, operator new declared with throw()

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
if ( tmp != NULL ) {
try {
T::constructor( tmp ) ;
} catch ( ... ) {
operator delete( tmp /* , any placement params. */ ) ;
throw ;
}
}

no corresponding delete, operator new() may throw:

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
T::constructor( tmp ) ;

no corresponding delete, operator new declared with throw()

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
if ( tmp != NULL ) {
T::constructor( tmp ) ;
}

As you can see, if there is a corresponding operator delete, the
compiler must call it if the constructor terminates with an
exception.

Note that except for the case of a placement new expression with
no corresponding delete or a local static variable, the compiler
always frees the memory allocated for the variable being
constructed. Except in new expressions, however, this all
happens behind the scenes, where you cannot get at it to
instrument. (While I've shown this as try blocks in the above,
it's more likely that the compiler uses the same mechanism it
uses to call destructors of local variables in practice.)

--
James Kanze (GABI Software) email:ja******* **@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientier ter Datenverarbeitu ng
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Dec 4 '07 #8
On Dec 4, 8:30 pm, James Kanze <james.ka...@gm ail.comwrote:
On Dec 4, 4:47 am, Abhishek Padmanabh <abhishek.padma n...@gmail.com>
wrote:

[...]
This is crucial, because the
constructor might throw an exception. The placement new expression sets
up an exception handler first of all, which has responsibility for
deallocation, before it calls the constructor for you -- the explicit
syntactical constructor call in the expression is, at the level of
execution, a wrapped call.
Sorry, this is new to me. How could the handler be set up by
the placement new call?

There are four different ways the compiler can generate code for
a new expression, depending on whether there is a corresponding
(placement) delete, and whether the operator new function is
declared not to throw or not. Basically (for p = new T):

corresponding delete, operator new() may throw:

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
try {
T::constructor( tmp ) ;
} catch ( ... ) {
operator delete( tmp /* , any placement params. */ ) ;
throw ;
}

corresponding delete, operator new declared with throw()

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
if ( tmp != NULL ) {
try {
T::constructor( tmp ) ;
} catch ( ... ) {
operator delete( tmp /* , any placement params. */ ) ;
throw ;
}
}

no corresponding delete, operator new() may throw:

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
T::constructor( tmp ) ;

no corresponding delete, operator new declared with throw()

T* tmp = operator new( sizeof(T) /* , any placement params.
*/ ) ;
if ( tmp != NULL ) {
T::constructor( tmp ) ;
}

As you can see, if there is a corresponding operator delete, the
compiler must call it if the constructor terminates with an
exception.

Note that except for the case of a placement new expression with
no corresponding delete or a local static variable, the compiler
always frees the memory allocated for the variable being
constructed. Except in new expressions, however, this all
happens behind the scenes, where you cannot get at it to
instrument. (While I've shown this as try blocks in the above,
it's more likely that the compiler uses the same mechanism it
uses to call destructors of local variables in practice.)
Ok, thanks for that. So then, how is an operator new overload (which
can be called an allocation function, right?) different from a user
defined placement new form (not using the one for in place
construction as available in <new>)?

operator new/operator delete overloads should match the signature of
their global forms provided by the compiler. And then when the objects
of the class, for which these are overloaded, are created using new
expression, use the operator new overload for allocation and the
corresponding operator delete for deallocation.

If placement allocation function and placement deallocation functions
also manage allocation and deallocation then what is different between
these and the above overloads? Just that if the signature if a direct
match with operator new/operator delete, they are overloads else they
are placement allocation functions?

Also, referring to the example as in 5.3.4 (20) as below:

struct S {
// Placement allocation function:
static void* operator new(std::size_t , std::size_t);
// Usual (non-placement) deallocation function:
static void operator delete(void*, std::size_t);
};

S* p = new (0) S; // ill-formed: non-placement deallocation function
matches
// placement allocation function

The standard also says (in 18.5.1.3 - Placement forms) that the
placement form function is reserved and a C++ program may not define
them that would displace these? Is that specific to the form as below:

void* operator new(std::size_t size , void* ptr ) throw();

and if I had a different argument list for this - would that be
allowed?
Dec 5 '07 #9
On Dec 5, 11:12 am, "Alf P. Steinbach" <al...@start.no wrote:
* Abhishek Padmanabh:
On Dec 4, 8:30 pm, James Kanze <james.ka...@gm ail.comwrote:
On Dec 4, 4:47 am, Abhishek Padmanabh <abhishek.padma n...@gmail.com>
wrote:
[...]
Ok, thanks for that. So then, how is an operator new overload (which
can be called an allocation function, right?) different from a user
defined placement new form (not using the one for in place
construction as available in <new>)?

"user defined placement form" is AFAIK not a term employed by the
standard, nor is it a commonly used term. But assuming you mean it as a
description: a "new" expression for single object accepts two lists of
arguments,

new (arglist1) T(arglist2)

arglist1 is passed to the allocation function, so by definining an
allocation function (which unfortunately is named "operator new") you
enable a particular signature for this argument list.

arglist2 is passed to a T constructor, so by definining a constructor
you enable a particular signature for this argument list.

There's not really more to it.
Yes, this is okay. Let's go a little further and see if I got it
right.
>
operator new/operator delete overloads should match the signature of
their global forms provided by the compiler.

No.
And then when the objects
of the class, for which these are overloaded, are created using new
expression, use the operator new overload for allocation and the
corresponding operator delete for deallocation.

Huh?
What I am saying is - if the overloaded operator new has the same
signature as that of the global operator new, then I can create
objects as below:

struct A {
A(/*constructor arg list*/);
void* operator new (size_t size); //same signature
as ::operator new() //1
};

int main()
{
A * ptr = new A(/*constructor arg list*/);
}

If the argument list is changed by adding additional arguments to the
operator new overload for class A as below:

struct A {
A(/*constructor arg list*/);
void* operator new (size_t size, size_t additional_argu ment); //
different signature as ::operator new() //2
};
int main()
{
A * ptr = new A(/*constructor arg list*/);
}

then the above way of create object of A will fail as a match is not
found but if the statement:

A * ptr = new A(/*constructor arg list*/);

is modified to :

size_t additional_argu ment=0;
A * ptr = new(additional_ argument) A(/*constructor arg list*/);

then the overloaded one will be called and this form of new expression
(which specifies arguments to allocation function) is called a
placement new form. Is that correct?

Also, one such overload is provided for the global allocation function
under the header <newthat does not do any allocation but just does
in place construction. Is that correct?
If placement allocation function and placement deallocation functions
also manage allocation and deallocation then what is different between
these and the above overloads? Just that if the signature if a direct
match with operator new/operator delete, they are overloads else they
are placement allocation functions?

It seems you are assuming a distinction that does not exist.
Since there is no distinction, placement new is any overload of
operator new that gets its additional arguments from the new
expression argument list. Is that correct? So, in the code I posted
above,

//1 - is an overload of operator new
//2 - is an overload of operator new but has additional arguments
and hence relates to placement new form where additional arguments
need to provided as part of arglist1 as in new (arglist1) T(arglist2)
as posted by you.
Also, referring to the example as in 5.3.4 (20) as below:
struct S {
// Placement allocation function:
static void* operator new(std::size_t , std::size_t);
// Usual (non-placement) deallocation function:
static void operator delete(void*, std::size_t);
};
S* p = new (0) S; // ill-formed: non-placement deallocation function
matches
// placement allocation function

The current standard's §5.3.4/20 does not have the above example, or any
example. However, this example is in §5.3.4/20 of the draft for C++0x.
That paragraph correspond to §5.3.4/19 in the current standard.

The rule concerning the ill-formed'ness of the above example was added
in the draft.

It's a special case that evidently wasn't considered in the 98 standard.
The standard also says (in 18.5.1.3 - Placement forms)

In the current standard this is §18.4.1.3.
that the
placement form function is reserved and a C++ program may not define
them that would displace these? Is that specific to the form as below:
void* operator new(std::size_t size , void* ptr ) throw();

No, it's specific to the two forms of operator new and two forms of
operator delete specified there, in the global namespace.
Is this the one that does in-place construction?
Dec 5 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
7841
by: tzach | last post by:
Call constructor on an already existing instance? I like to execute the constructor logic, including all the class member constructors, on an existing instance (with out executing the destructor). Can it be? Thanks.
3
2863
by: Jacques Labuschagne | last post by:
Hi all, Is it legal to kill an object and build a new one of the same type in its memory? class A{ int i; public: explicit A(int value): i(value){} };
6
7515
by: Christoph Bartoschek | last post by:
Hi, gcc 3.4 rejects the following program: class T { public: T() : a(3) {} explicit T(T const & other) : a(other.a) {} private: int a;
23
5179
by: Fabian Müller | last post by:
Hi all, my question is as follows: If have a class X and a class Y derived from X. Constructor of X is X(param1, param2) . Constructor of Y is Y(param1, ..., param4) .
8
2979
by: trying_to_learn | last post by:
Why do we need to explicitly call the copy constructor and the operator = , for base class and member objects in composition? ....book says "You must explicitly call the GameBoard copy-constructor or the default constructor is automatically called instead" Why cant the compiler do this on its own. if we are making an object through copr construction for an inherited class , then why not simply call the corresponding copy constructors for...
20
2749
by: frs | last post by:
For memory economization, I need to get rid if the virtual destructor. Under this constraint I get caught up in a design, where I need to call a destructor of a derived class from a base class. Briefly it could be displayed like the code below. It ends up deleting the member 'x' of 'B' twice. Why? Is there a way around? Thanks Frank
9
1509
by: Rennie deGraaf | last post by:
I'm writing a class similar to this: #include <iostream> using namespace std; template<class t> class Foo { private: class Bar {
7
2710
by: dragoncoder | last post by:
Hello experts, I have the following code me. =cat mystring.h #include<iostream> using namespace std; class mystring {
7
2133
by: michael | last post by:
Hi All, I have written the following to illustrate a problem. I know I have some magic numbers etc please ignore them. What I do not follow is why the line marked results in a call to the destructor for the object. Can someone please explain it for me? #include <iostream>
0
8968
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8787
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
9473
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
9208
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
8208
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
6750
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6053
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
1
3279
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
2744
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.